我已经发现了很多关于在Python中使用import的基础知识的文章和教程,但没有一篇能提供有关使用多个软件包设置自己的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
函数运行脚本,但我想我可能希望两种方式都可以工作。
-m
开关?无论如何,将main
提取到外部scripts
目录中是有效的,但这是设置所有这些的唯一规范方法吗?答案 0 :(得分:1)
您需要将codename/
的父目录添加到PYTHONPATH
环境变量(或编写/使用setup.py
文件,或修改{{1在运行时)
您需要在sys.path
codename/__init__.py
如果你写/使用from .package1 import function1
文件,否则setup.py
您应该使用from codename.package1 import function1
文件作为脚本/可执行文件,因为它可以使所有内容更加清晰(无论如何您迟早都需要setup.py
文件)
(和6.)我建议使用setup.py
它会自动找到所有测试(并且可以并行运行等)。
这应该是开箱即用的,但如果您已经写了py.test
,那么您可以在任何地方(以及在任何平台上)运行它们,只需{{1} }。