[英]Importing python modules from different directories
我有一個 flask 應用程序,其結構基本如下:
app/
__init__.py
myapp.py
common/
tool1.py
tool2.py
web/
__init__.py
views.py
api/
api_impl.py
worker/
__init__.py
worker.py
tasks.py
我在myapp.py
中初始化了一個重要的 object 我在幾個地方使用,我可以從common/tool1.py
和web/api/api_impl.py
訪問它from myapp import object
。 我已經能夠在web/
和tool2
的多個地方使用tool1
和myapp.py
導入from common.tool1 import tool1_def
。
其他相關事實在myapp.py
中有一個用於藍圖的import web
語句,而app/__init__.py
和worker/__init__.py
為空。 web/__init__.py
包含路由的藍圖定義。
我可以毫無問題地使用 gunicorn 運行該應用程序,但是當我嘗試使用python app/worker/worker.py
運行我的工作人員時,我收到錯誤ModuleNotFoundError: No module named 'myapp'
。 worker.py
正在嘗試導入 myapp.py 中定義的相同myapp.py
。
我只是不明白為什么我可以運行該應用程序並且它可以工作,但是當我嘗試運行工作程序時它卻沒有。 在這種情況下,我絕對沒有完全理解導入系統,而且我在網上閱讀的所有內容似乎都沒有完全闡明這一點。
您的工作導入意味着項目根目錄是 app 文件夾。 因此,您需要從此文件夾中的工作人員午餐(或將其添加到 PYTHONPATH 環境變量)
python worker/worker.py
或者
python -m worker.worker
此外,應刪除 app 文件夾中的__init__.py
,因為 app 不是 package 而是項目根目錄。
我們經常用於開發和調試(但也適用於生產)的一種方法如下。 您可以將其添加到每個(有問題的?)模塊,或者如果您選擇所有模塊。
import os
import sys
# Add your project root to sys.path.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
from common import tool1
from common import tool2
from worker import worker
etc ...
在這里,您將項目根添加到sys.path
。 執行導入時,Python 首先通過sys.path
查找您嘗試導入的模塊。 因此,在這里,您將項目根目錄添加為sys.path
中的第一項。
另一個優點是這些導入對您的項目是明確的。 例如,如果您有一個要導入的本地workers
模塊,但在site-packages
中還有一個workers
package ,這將首先在您的本地項目中查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.