使用 setuptools 创建 python 可执行文件

2024-01-14

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

我的目录结构如下所示:

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 error


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

它恰好可以就地工作,至少在 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他们自己。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 setuptools 创建 python 可执行文件 的相关文章

随机推荐

  • odoo 9 - 如何限制 one2many 不显示表单视图

    我有一个 Many2many 它使用 one2many 小部件 我设置了 mode tree 并使用 editable bottom 这在编辑模式下按预期工作 但是在查看模式下 如果用户单击一行 它将在表单视图中打开该行 我如何防止这种情况
  • 如何在

    这个问题在这里已经有答案了 我有一个在 XAML 中声明的按钮 它具有 MouseDown 和 MouseUp 属性 它们都调用指定的方法
  • 通过排序快速插入/删除的数据结构

    我正在拼命寻找一种数据结构 允许我执行大量插入 几乎同样多的删除 可能是相同的数量级 以及非常快速地查找最高 或最低 可以使用其中任何一个 值 删除始终只会影响最高 或最低 值 问题是这些值必须进行排序 并且在任何时候我都可以在其他两个之间
  • RestAdapter(改造)在android中无法解析

    所以我尝试在我的项目中使用 Retrofit 正如该网站所说 我已经包括了compile com squareup retrofit retrofit 2 0 0 beta1 in build gradle 我正在阅读此教程link htt
  • Windows - 无法强制关闭网络文件句柄 - 无法关闭系统(Pid 4)文件句柄

    首先 很抱歉问了这么长的问题 但我想提供足够的细节 概要 在 Windows 中 似乎无法强制关闭通过网络共享打开的文件句柄 因此 通过网络共享打开的文件无法移动 重命名 删除 我用的是Win 7 问题 任何人都可以看到我做错了什么 或者有
  • 以角度动态更改 css 变量

    在我的角度项目中 我在顶层定义了一些 css 变量样式 scss像这样的文件 我在很多地方使用这些变量来保持整个主题的一致性 root theme color 1 f7f7f7 theme color 2 ec4d3b theme colo
  • Android启动意图查看apk

    在我的应用程序中 我下载一个 apk 并将其保存到 SD 卡 然后我想开始安装该 apk 我正在使用以下代码来尝试此操作 Intent intent new Intent intent setAction Intent ACTION VIE
  • Mathematica 中的变换分布

    我开发了一些代码来从 LogNormalDistribution 和 StableDistribution 的乘积生成随机变量 LNStableRV Alpha Beta Gamma Sigma Delta n Module LNRV SD
  • 如何找到相交矩形的交点矩形(点)

    如果我有两个相交的矩形 x1 y1 x2 y2 x3 y3 x4 y4 由两个顶点描述 如何找到一个由它们的交集产生的矩形 得到这些矩形相交的 2 个点 编程语言并不重要 可能是伪代码 PS 矩形与 OXY 平行 你可以使用矩形 交集 ht
  • 让 VertexRenderingFunction 缩放(不缩放)

    我在自定义 VertexRenderingFunction 以不同尺寸显示不同图形时遇到问题 下面是一个示例 默认的顶点渲染函数具有所需的行为 因为顶点在所有图中看起来都相同 有什么建议如何使用自定义顶点来实现这一点吗 source yar
  • 软件生成的中断和软件生成的异常有什么区别?

    我正在阅读英特尔手册 3A 第 6 章中断和异常处理 中断和异常分别有3个来源 对于软件生成的中断 它说 INT n 指令允许从内部产生中断 软件通过提供中断向量号作为操作数 为了 例如 INT 35 指令强制隐式调用 中断 35 的中断处
  • urllib2 中重复主机查找失败

    我的代码使用 Python 的 urllib2 在多个线程中发出许多 HTTP GET 请求 将响应写入文件 每个线程一个 在执行过程中 看起来许多主机查找失败 导致名称或服务未知错误 请参阅附加的错误日志以获取示例 这是由于 DNS 服务
  • Google Analytics API 在示例代码中返回 401

    我正在尝试从谷歌分析的内容实验中检索数据 我正在使用以下代码 我的信用良好 并且已针对这篇文章进行了审查
  • 查找 exe 是否动态链接(Windows)

    windows下如何判断一个exe是动态链接还是静态链接 所有 Windows 应用程序都动态链接到 Windows API 如果您需要确定特定的非 Windows 库 如 libxml 或类似库 的链接方式 Visual Studio 包
  • 使用 YouTube API v3 检查视频是否有年龄限制

    有没有办法使用 YouTube API v3 来检查视频是否有年龄限制 查看文档我无法确认这一点 我发现了一些与此相关的内容 请检查 https www googleapis com youtube v3 videos part conte
  • 错误 [ERR_REQUIRE_ESM]:如何在节点 12 中使用 es6 模块?

    From https 2ality com 2019 04 nodejs esm impl html https 2ality com 2019 04 nodejs esm impl htmlNode 12应该支持es6模块 但是 我不断收
  • python-tz 是我错了还是它是一个错误

    这似乎有点奇怪 当我想用 pytz 获取欧洲 巴黎时区时 它让我进入 PMT 时区 而不是 GMT 1 当它似乎适用于欧洲 柏林时 不清楚 看看这个片段 usr bin python import os import datetime fr
  • `numpy.argmax()` 的理论平均情况运行时复杂度

    我正在看代码numpy argmax功能 我很困惑哪种数据结构numpy维持为argmax功能 https numpy org doc stable reference generated numpy argmax html https n
  • 使用 VS 项目检查代码的 xslt 将 Xml 转换为 html

    我有一个InspectionResults xml当我运行时生成的inspectcode exe from JetbrainsCommandLine Tool Analysis 有没有xslt提供的文件Jetbrains将此 xml 转换为
  • 使用 setuptools 创建 python 可执行文件

    我有一个小的 python 应用程序 我想将其制作为类 UNIX 系统的可下载 可安装的可执行文件 我的印象是安装工具将是实现这一目标的最佳方法 但不知何故 这似乎不是一项常见任务 我的目录结构如下所示 myappname setup py