的Python Cookbook暗示下面的树结构的“典型库包”:如何在包中包含示例或测试程序?
projectname/
README.txt
Doc/
documentation.txt
projectname/
__init__.py
foo.py
bar.py
utils/
__init__.py
spam.py
grok.py
examples/
helloworld.py
你会注意到的是,examples/
不是实际的包,它位于projectname/projectname/
下的部分(这就是你“可以找到封装的顶级__init__.py
)。
那么,examples/helloworld.py
显然需要导入projectname
包。
我知道在StackOverflow中至少有2-3个相关的问题。我不认为这是重复的,因为其他问题要么涉及包内导入,要么涉及从另一个导入一个python模块的一般情况,因为它们不驻留在同一个目录中。打包库时,我特意要求建议的方法。
有没有办法实现这一点,而无需修改路径?如果修改路径是唯一的方法,那么有没有办法以优雅的方式来完成?
让我详细说明最后一点。在Kenneth Reitz的Repository Structure and Python中,出现了类似的结构,其中tests/
而不是examples/
。这是完全一样的问题。他建议使用“一个简单的(但明确的)路径修改来正确解析软件包。” OK,但这是实际代码:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
我真的不喜欢..
部分。我希望有一个更通用的解决方案,希望能够从我选择运行该示例(或测试)的任何目录开始工作。
你的意思是除了在导入中使用相对路径或显式传递模块来导入?如果projectname是一个包,你可以随时在安装后直接导入它。在测试中,这通常是你做的。我在你的问题中遗漏了什么? – nir0s
“在导入中使用相对路径还是显式传递模块导入”将如何工作?例如,“examples/helloworld.py''的输入行是什么?因为我一直无法做到这一点......至于另一个建议,Kenneth Reitz也提到了“期望将包装安装在网站包装中”作为替代方案,但是反对它。 –
那我一定是误解了。你想从'examples'中导入某些东西?如果是这样,为什么它不是一个包? – nir0s