繁体   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