问题
我找到了许多有关在Python中使用导入的基础的文章和教程,但是没有一篇文章和教程可以提供有关使用多个程序包设置自己的Python项目的全面指南。
这是我项目的结构:codename/
__init__.py
package1.py
(具有class1
并且是脚本)package2.py
(具有class2
)package3.py
(具有function1
并且是脚本)test/
__init__.py
test_package1.py
(具有package1
的单元测试)test_package3.py
(具有package3
的单元测试)
如何设置导入以满足以下要求(并且所有这些都有意义吗?):class1
,class2
和function1
在命名空间codename
中,即,这有效:
import codename
obj = codename.class1()
codename.function1(obj)
可以使用
from codename import *
或from codename import class1
以相同的方式导入它们function1
可以轻松访问class1
(如何?)package1
和package2
是可执行脚本test_package1.py
和test_package3.py
测试也可以通过
python -m unittest discover
执行脚本也可以通过
python -m codename.package1
执行由于某些原因,我遇到了所有这些问题都无法解决的问题,而当我尝试解决一个问题时,就会弹出另一个问题。
我尝试了什么?
将
codename/__init__.py
保留为空几乎可以满足所有要求,因为一切正常,但是将class1
之类的名称保留在其模块的命名空间中-而我希望将它们导入到程序包中。再次添加
from codename.package1 import class1
等可以满足大多数要求,但是通过python -m codename.package1
执行脚本时会收到警告:RuntimeWarning: 'codename.package2' found in sys.modules \
after import of package 'codename', but prior to execution of \
'codename.package2'; this may result in unpredictable behaviour
哪一种有意义...
通过
python codename/package1.py
函数运行脚本,但是我想我可能想同时使用两种方法。我碰到an answer to a similar question时说,内部模块也不应该是脚本,但是我不明白为什么我们要使用
-m
开关?无论如何,将main
提取到外部scripts
目录中是可行的,但这是设置所有这些的唯一规范方法吗? 最佳答案
您需要将codename/
的父目录添加到PYTHONPATH
环境变量(或写入/使用setup.py
文件,或在运行时修改sys.path
)
您需要将要导出的所有名称导入codename/__init__.py
如果写入/使用from .package1 import function1
文件,则为setup.py
,否则为from codename.package1 import function1
您应该将setup.py
文件用于脚本/可执行文件,因为这会使一切变得更加整洁(无论如何,迟早需要一个setup.py
文件)
(和6。)我建议使用py.test
它将自动为您找到所有测试(并可以并行运行等)。
这应该是开箱即用的,但是如果您编写了setup.py
,则可以像package1
一样从任何地方(在任何平台上)运行它们。
关于python - 在多模块项目中设置导入和__init__.py,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42364598/