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