将包内的模块作为可执行文件启动是不好的做法.
当您开发某些东西时,您要么构建一个库,该库旨在由其他程序导入,因此允许直接执行其子模块没有多大意义,要么构建一个可执行文件,在这种情况下没有理由将其作为一部分一个包的。
这就是为什么在setup.py
您可以区分包和脚本。包裹将进入site-packages
而脚本将安装在/usr/bin
(或类似位置,具体取决于操作系统)。
因此,我的建议是使用以下布局:
/
├── mydirectory
| ├── __init__.py
| ├── file1.py
└── file2.py
Where file2.py
进口file1.py
与任何其他想要使用该库的代码一样mydirectory
, 与绝对进口:
from mydirectory.file1 import f
当你写一个setup.py
您只需列出的项目的脚本mydirectory
作为一个包和file2.py
作为脚本,一切都会正常。无需摆弄sys.path
.
如果您出于某种原因确实想要实际运行包的子模块,正确的方法是使用-m
switch:
python -m mydirectory.file1
这会加载整个包,然后将模块作为脚本执行,从而使相对导入成功。
我个人会避免这样做。另外,因为很多人甚至不知道你可以做到这一点,并且最终会得到与你相同的错误,并认为包已损坏。
关于当前接受的答案,它说你应该只使用implicit相对进口from file1 import f
因为它会工作,因为它们位于同一目录中:
This is wrong!