这里的问题是你的包布局被破坏了。
它恰好可以就地工作,至少在 2.x 中是这样。为什么?您没有以以下方式访问该包myappname
- 但与该包的目录相同的目录也是顶级脚本目录,因此您最终会通过旧式相对导入获取其任何同级目录。
当然,一旦你安装了东西,你最终会得到myappname
安装在您的站点包中的包,然后复制myappname.py
安装在你的路径上的某个地方,所以相对导入不可能工作。
正确的方法是将顶级脚本放在包之外(或者,理想情况下,将其放入bin
目录)。
另外,您的模块和脚本不应具有相同的名称。 (有很多方法可以实现这一点,但是……不要尝试。)
因此,例如:
myappname/
|-- setup.py
|-- myscriptname.py
|-- myappname/
| |-- __init__.py
| |-- src/
| |-- __init__.py
| |-- mainclassfile.py
当然,到目前为止,它所做的一切都是在就地模式下进行中断,与安装时的中断方式完全相同。但至少这使得事情更容易调试,对吧?
无论如何,你的myscriptname.py
然后必须使用绝对导入:
import myappname.src.mainclassfile
和你的setup.py
必须在正确的位置找到脚本:
scripts=['myscriptname.py'],
最后,如果您需要一些代码myscriptname.py
为了可以在模块内部以及脚本中访问,正确的做法是将其重构为两个文件,但如果由于某种原因这太困难,您始终可以编写一个包装器脚本。
See 安排文件和目录结构 https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/creation.html#directory-layout以及《包装搭便车指南》中的相关部分了解更多详细信息。
另请参阅PEP 328 http://www.python.org/dev/peps/pep-0328/有关绝对导入和相对导入的详细信息(但请记住,当它指的是“直到 Python 2.5”时,它实际上意味着“直到 2.7”,而“从 2.6 开始”意味着“从 3.0 开始”。
有关包含通过这种方式安装的脚本的软件包的一些示例setup.py
(并且,通常,easy_install
and pip
), see ipython
, bpython
, modulegraph
, py2app
, 而且当然easy_install
and pip
他们自己。