尝试在多个 Flask 服务器中重用代码,在导入时陷入困境,出现错误"ModuleNotFoundError"或"ImportError"



我的目标是将代码导入三个独立的Flask服务器。进展不顺利。我在python 3.10.4。我读过大约10篇不同的帖子,上面写着";将CCD_ 2文件放在您的文件夹中";我已经做到了。

就上下文而言,我对Python并不完全陌生,但我从未正确学习过导入/模块系统。

我有三台Flask服务器,它们在不同(但相似(的网站上运行抓取操作。出于各种原因,我需要他们分开。无论如何,这三个都需要运行相同的过程,从我的代理提供商那里获得代理的IP。为此,我有一些代码:

# we don't need the details here so I snip it to save space
def get_proxy_ip(choice):
r = requests.get(download_list, headers={"Authorization": "Token " + token})
selected_proxy_ip = r.json()["results"][choice]["proxy_address"]
selected_proxy_port = r.json()["results"][choice]["port"]
print(selected_proxy_ip)
return selected_proxy_ip, selected_proxy_port

我想在我的所有3台Flask服务器上使用这个功能。以下是我尝试将代码导入其中一个Flask服务器的各种方法:

scrapers/rentCanada/app.py

import requests
from flask import Flask, request, make_response
print("cats")
app = Flask(__name__)
print(__name__, __package__)
# from ..shared.ipgetter import get_proxy_ip
# from ..shared.checker import check_public_ip
# from scrapers.shared.ipgetter import get_proxy_ip
# from scrapers.shared.checker import check_public_ip
import shared.ipgetter as ipgetter
import shared.checker as checker

它们都不起作用。import shared.ipgetter as ipgetter产量:

cats
__main__ None
Traceback (most recent call last):
File "/home/rlm/Code/canadaAps/scrapers/rentCanada/app.py", line 10, in <module>
import shared.ipgetter as ipgetter
ModuleNotFoundError: No module named 'shared'

ModuleNotFoundError: No module named 'scrapers'产量:ModuleNotFoundError: No module named 'scrapers'

from ..shared.ipgetter import get_proxy_ip产量:ImportError: attempted relative import with no known parent package

此时,您需要查看我的文件夹结构。

/scrapers
..__init__.py
..setup.py
../rentCanada
.....__init__.py
.....app.py
../rentFaster
.....__init__.py
.....app.py
../rentSeeker
.....__init__.py
.....app.py
../shared
.....__init__.py
.....ipgetter.py
.....checker.py

我需要能够使用任何app.py文件作为入口点。

我也试过setup.py这个:

from setuptools import setup, find_packages
setup(
name = 'tools',
packages = find_packages(),
)

接着是CCD_ 11;工具";可以在app.py中导入,就像我想要的一样。

最后,我怀疑有人会告诉我使用蓝图。对我来说,如果我添加一条路线,这些看起来就像是我会使用的工具。我不确定它们是否适合一个简单的函数,但也许我错了。

我目前的解决方案是从/scrapers文件夹运行带有python rentCanada/app.py的Flask,并使用以下代码

import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent))  # necessary so util folder is available
import requests
from flask import Flask, request, make_response
print("cats")
app = Flask(__name__)
print(__name__, __package__)
from util.ipgetter import get_proxy_ip
from util.checker import check_public_ip

因此,程序会将app.py文件夹的父文件夹附加到路径中。这使得app.py文件中的util文件夹(以前是shared,但有命名冲突(可用。

最新更新