[英]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.