繁体   English   中英

使用setuptools创建python可执行文件

[英]Create a python executable using setuptools

我有一个小的python应用程序,我想将其制作成类UNIX系统的可下载/可安装的可执行文件。 我的印象是,setuptools将是实现这一目标的最佳方式,但不知何故,这似乎不是一项常见的任务。

我的目录结构如下所示:

myappname/
|-- setup.py
|-- myappname/
|   |-- __init__.py
|   |-- myappname.py
|   |-- src/
|      |-- __init__.py
|      |-- mainclassfile.py
|      |-- morepython/
|         |-- __init__.py
|         |-- extrapython1.py
|         |-- extrapython2.py

包含if __name__ == "__main__":的文件是myappname.py。 这个文件在顶部有一行, import src.mainclassfile

下载后,我希望用户能够执行以下操作

$ python setup.py build
$ python setup.py install

然后它将是一个已安装的可执行文件 ,它们可以从命令行的任何位置调用:

$ myappname arg1 arg2

我的setup.py的重要部分如下:

from setuptools import setup, find_packages
setup(
  name='code2flow',
  scripts=['myappname/myappname.py'],
  package_dir={'myappname': 'myappname'},
  packages=find_packages(),
  )

当前状态

通过运行:

$ sudo python setup.py install

然后在一个新的shell中:

$ myapp.py

我得到一个No module named错误的No module named

这里的问题是您的包布局被破坏了。

它碰巧就地工作,至少在2.x. 为什么? 您没有以myappname访问该程序包 - 但是该程序包的目录也是顶级脚本目录的同一目录,因此您最终通过旧式相对导入获取其任何兄弟。

当然,一旦你安装了东西,你最终会在你的站点包中安装myappname包,然后在你的PATH上的某个地方安装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某些代码可以在模块内部以及脚本中访问,那么正确的做法是将其重构为两个文件 - 但如果由于某种原因这太难了,您可以随时写一个包装脚本。

有关详细信息,请参阅Hitchhiker的打包指南中的排列文件和目录结构及相关章节。

有关绝对导入和相对导入的详细信息,请参阅PEP 328 (但请记住,当它指的是“高达Python 2.5”时,它实际上意味着“高达2.7”,而“从2.6开始”意味着“从3.0开始”。

有关包含通过setup.py (通常是easy_installpip )以这种方式安装的脚本的软件包的一些示例,请参阅ipythonbpythonmodulegraphpy2app ,当然还有easy_installpip自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM