问题

我找到了许多有关在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的单元测试)



如何设置导入以满足以下要求(并且所有这些都有意义吗?):


class1class2function1在命名空间codename中,即,这有效:

import codename
obj = codename.class1()
codename.function1(obj)

可以使用from codename import *from codename import class1以相同的方式导入它们
function1可以轻松访问class1(如何?)
package1package2是可执行脚本
test_package1.pytest_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/

10-17 02:19