簡體   English   中英

如何在模塊中導入 package

[英]How to import package in module

我是 Python 的新手,我嘗試構建我的 Python 應用程序。
給定以下目錄結構:

📦app  
 ┣ 📂lexer  
 ┃ ┣ 📂token  
 ┃ ┃ ┣ 📜token.py  
 ┃ ┃ ┣ 📜type.py  
 ┃ ┃ ┗ 📜__init__.py  
 ┃ ┗ 📜__init__.py  
 ┣ 📂test  
 ┃ ┣ 📂lexer  
 ┃ ┃ ┣ 📂token   
 ┃ ┃ ┃ ┣ 📜test_token.py  
 ┃ ┃ ┃ ┗ 📜__init__.py  
 ┃ ┃ ┗ 📜__init__.py   
 ┃ ┣ 📜test_app.py  
 ┃ ┗ 📜__init__.py   
 ┗ 📜app.py  

現在,應用程序使用以下命令執行:

pyhton -m app

當我嘗試使用執行應用程序時

python -m .\app.py

引發以下錯誤:

Relative module names not supported.

單元測試正在使用:

python -m unittest

這工作正常,沒有問題。 現在,我正在嘗試在 app.py 文件中使用導入token / type.py app.py文件。

這個文件的內容是:

from enum import Enum, unique

@unique
class Type(Enum):
    UNKNOWN = 1
    EOF     = 2

app.py文件中添加了以下導入語句:

from app.lexer.token.type import Type

現在運行應用程序會產生以下錯誤:

Traceback (most recent call last):
  File "C:\Python38\lib\runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Python38\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\DEV\DEMO.ONE\app\app.py", line 17, in <module>
    from app.lexer.token.type import Type
  File "C:\DEV\DEMO.ONE\app\app.py", line 17, in <module>
   from app.lexer.token.type import Type
ModuleNotFoundError: No module named 'app.lexer'; 'app' is not a package

關於如何解決這個問題的任何想法?

app/本身不是 package - 因為它不包含__init__文件-。 app/是應用程序的根目錄,而包的路徑以lexer開頭。 所以,改變

from app.lexer.token.type import Type

from lexer.token.type import Type

應用程序不是 package。 “目錄”通過添加init .py 變為 package。嘗試添加 app/ init .py。

附帶說明,類型是 python 中的內置 class。 將模塊命名為 type.py 是個壞主意。 現在重命名,否則你以后會后悔的。

我認為您需要在從項目根文件夾執行腳本之前設置環境變量PYTHONPATH

在項目根文件夾的命令行中,執行:

export PYTHONPATH=$(pwd)

或將上述內容放在項目根文件夾的 a.env 文件中並執行

source .env

在執行你的腳本之前

實際上,python 不知道您的應用程序 package。 當您運行 python -m app 時,它可以正常工作,因為您(我想)在 app 目錄中啟動了它。 因此 python 也嘗試在當前目錄中查找它。 但是隨后您嘗試導入 app.something,但這不起作用。 嘗試只導入 lexer.token.type。 如果這行得通,我們知道我們走在正確的軌道上。

然后嘗試

touch __init__.py
cd ..
python -m app.app

現在,要告訴 python package,您必須創建一個 setup.py 文件,然后通過執行安裝它

pip install -e .

這會將鏈接放入 python 庫的站點包目錄,python 會知道它。 完成后,您將能夠從任何地方運行 python -m app.app。

您可能想了解 distutils: https://docs.python.org/3/distutils/setupscript.html

或 python 包裝: https://packaging.python.org/tutorials/packaging-projects/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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