【问题标题】:Do I need an __init__.py if I want to build a standalone program and not a package?如果我想构建一个独立的程序而不是一个包,我需要一个 __init__.py 吗?
【发布时间】:2015-02-19 17:53:32
【问题描述】:

我正在开发一个独立的 Python-GUI 程序。当我跑步时

python3 setup.py sdist

我收到以下警告:

package init file 'main-application-folder/__init__.py' not found (or not a regular file)

此警告是否仅适用于软件包,还是独立 Python 程序也应该有 __init__.py 而不是 main-window.pymy-first-program.py 之类的东西?

我应该重命名我的主文件(在我的情况下是 ìbk-st.py__init__.py)还是在 __init__.py 中保留某个结构会更好(即创建一个单独的文件来调用 ibk-st.py 文件)

项目链接:

【问题讨论】:

  • 不清楚你在 "packages""standalone Python program" 之间有什么区别 - 包通常 是 独立程序。您有许多 .py 文件组合在一个目录中,所以是的,您应该编写一个 __init__.py 来指定应该从它们公开的内容。
  • 这个答案可能对你有帮助:stackoverflow.com/questions/28444747/…
  • @jonrsharpe:很抱歉很容易混淆,但这是否意味着我应该将我的 ibk-st.py 重命名为 __init__.py 或者 __init__.py 应该满足某些规范?
  • @Spießbürger 我想你可以,但那将是非常规的 -​​ __init__.py 通常包含很少的代码,只是导入要在外部公开的名称。参见例如stackoverflow.com/q/448271/3001761
  • 你的 setup.py 中有 packages = ["ibk-st"],所以 distutils 自然会在包中要求 init.py。如果您不想分发包,只需使用 py-modules。

标签: python software-distribution


【解决方案1】:

您应该将ibk-st 重命名为python 的有效包标识符(ibk_st 可能);然后将ibk-st.py 变成main_ui.py 之类的东西;然后为整个包设置一个__init__.py(或者您可以将ibk-st.py 重命名为__init__.py)。

请注意setup.py can install command line scripts;您可以提供一个瘦包装器作为文件bin/ibk-st-ui 的内容

#!/usr/bin/env python

from ibk_st.main_ui import main
main()

模块安装将确保脚本可在用户使用的任何平台上运行。

那么在你的setup.py 你应该有

...
packages = [ 'ibk_st' ],
scripts=[ 'bin/ibk-st-ui' ],
...

现在当你运行setup.py install或安装包时,模块可以嵌入到其他程序中并且命令ibk-st-ui将安装在bin文件夹中(不管是virtualenv 的 bin 或系统 /usr/local/bin),可以运行 UI。

【讨论】:

  • 谢谢,这很有帮助。我会仔细研究这些细节并整理好我的项目结构!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2020-07-28
  • 2021-05-08
相关资源
最近更新 更多