使用 setuptools 创建 python 可执行文件

Posted

技术标签:

【中文标题】使用 setuptools 创建 python 可执行文件【英文标题】:Create a python executable using setuptools 【发布时间】:2013-05-20 11:34:03 【问题描述】:

我有一个小型 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 错误

【问题讨论】:

当像./myappname.py一样直接调用时? @scottmrogowski 我必须对上述设置进行哪些更改才能创建用于分发的可执行文件,但不能将其安装在我的本地系统上? @theJollySin 我不确定我是否理解您的问题。我的问题是关于通过源代码和 setup.py 方法分发应用程序。也许您正在寻找一种创建独立 .exe 或 .app 的方法?我自己不知道该怎么做,但谷歌找到了一些简单的答案logix4u.net/component/content/article/27-tutorials/…pythonhosted.org/py2app 【参考方案1】:

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

它恰好在原地工作,至少在 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 中的一些代码可以在模块内部以及脚本中访问,正确的做法是将其重构为两个文件——但如果由于某种原因这太难了,你总是可以写一个包装脚本。

请参阅 Arranging your file and directory structure 和 Hitchhiker 包装指南中的相关部分了解更多详情。

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

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

【讨论】:

哇!很棒的综合解释。对我来说,关键是要了解正在发生的两件事。脚本和库都是单独安装的。现在工作得很好,谢谢!

以上是关于使用 setuptools 创建 python 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

python 创建虚拟环境时报错OSError, setuptools下载失败

setuptools包的使用

安装setuptools和pip

python如何将自己写的代码打包供他人使用

如何安装python基础工具包setuptools

[工具] 利用setuptools打包python程序