sco*_*ski 9 python unix egg setuptools
我有一个小的python应用程序,我想将其制作成类UNIX系统的可下载/可安装的可执行文件.我的印象是,setuptools将是实现这一目标的最佳方式,但不知何故,这似乎不是一项常见的任务.
我的目录结构如下所示:
myappname/
|-- setup.py
|-- myappname/
| |-- __init__.py
| |-- myappname.py
| |-- src/
| |-- __init__.py
| |-- mainclassfile.py
| |-- morepython/
| |-- __init__.py
| |-- extrapython1.py
| |-- extrapython2.py
Run Code Online (Sandbox Code Playgroud)
包含的文件if __name__ == "__main__": 是myappname.py.这个文件在顶部有一行import src.mainclassfile.
下载后,我希望用户能够执行以下操作:
$ python setup.py build
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)
然后它将是一个已安装的可执行文件,它们可以从命令行的任何位置调用:
$ myappname arg1 arg2
Run Code Online (Sandbox Code Playgroud)
我的setup.py的重要部分如下:
from setuptools import setup, find_packages
setup(
name='code2flow',
scripts=['myappname/myappname.py'],
package_dir={'myappname': 'myappname'},
packages=find_packages(),
)
Run Code Online (Sandbox Code Playgroud)
通过运行:
$ sudo python setup.py install
Run Code Online (Sandbox Code Playgroud)
然后在一个新的shell中:
$ myapp.py
Run Code Online (Sandbox Code Playgroud)
我收到了一个No module named错误
aba*_*ert 12
这里的问题是您的包布局被破坏了.
它碰巧就地工作,至少在2.x. 为什么?您没有访问该软件包myappname- 但是该软件包目录所在的同一目录也是顶级脚本目录,因此您最终会通过旧式相对导入获取其任何兄弟姐妹.
当然,一旦你安装了东西,你最终会myappname在你的站点包中安装软件包,然后myappname.py在你的PATH上的某个地方安装一个副本,所以相对导入不可行.
正确的方法是将顶级脚本放在包之外(或者理想情况下放在bin目录中).
此外,您的模块和脚本不应具有相同的名称.(有一些方法可以使这项工作,但......只是不要尝试.)
所以,例如:
myappname/
|-- setup.py
|-- myscriptname.py
|-- myappname/
| |-- __init__.py
| |-- src/
| |-- __init__.py
| |-- mainclassfile.py
Run Code Online (Sandbox Code Playgroud)
当然到目前为止,所有这一切都使它在就地模式中断,与安装时断开的方式完全相同.但至少这使得调试更容易,对吧?
无论如何,你myscriptname.py必须使用绝对导入:
import myappname.src.mainclassfile
Run Code Online (Sandbox Code Playgroud)
你setup.py必须在正确的地方找到脚本:
scripts=['myscriptname.py'],
Run Code Online (Sandbox Code Playgroud)
最后,如果您需要myscriptname.py在模块内部以及脚本中访问某些代码,那么正确的做法是将其重构为两个文件 - 但如果由于某种原因这太难了,您总是可以编写一个包装器脚本.
有关详细信息,请参阅Hitchhiker的打包指南中的排列文件和目录结构及相关章节.
有关绝对导入和相对导入的详细信息,请参阅PEP 328(但请记住,当它指的是"高达Python 2.5"时,它实际上意味着"高达2.7",而"从2.6开始"意味着"从3.0开始".
对于包装说明包括获得通过这种方式安装脚本的几个例子setup.py(而不同,通常easy_install和pip),看ipython,bpython,modulegraph,py2app,当然easy_install和pip自己.
| 归档时间: |
|
| 查看次数: |
7262 次 |
| 最近记录: |