簡體   English   中英

從不同目錄導入 python 模塊

[英]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.pyweb/api/api_impl.py訪問它from myapp import object 我已經能夠在web/tool2的多個地方使用tool1myapp.py導入from common.tool1 import tool1_def

其他相關事實在myapp.py中有一個用於藍圖的import web語句,而app/__init__.pyworker/__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM