Python:模块和打包 - 为什么 __init__.py 文件不在 __main__.py 之前执行?

2023-11-21

我有一个 python 程序,它完全包含在具有以下结构的目录中:

myprog/
├── __init__.py
├── __main__.py
├── moduleone.py
└── moduletwo.py

我希望能够打包并分发它,以便其他开发人员可以做pip install -e /path/to/git/clone/of/myprog然后可以将 myprog 导入到他自己的程序中并用它做一些很酷的事情。

我还希望能够在命令行运行 myprog,如下所示:

PROMPT> python myprog

当我这样做时,我希望 python 执行__main__.py模块,它确实做到了。但是,该模块引用了在中声明的一些函数__init__.py并且当程序在命令行运行时以及由另一个程序导入时都需要可用。但是,我收到以下错误:

NameError: name 'function_you_referenced_from_init_file' is not defined

我必须将这些函数导入到__main__.py不知何故?

我尝试了一个简单的例子,如下所示:

PROMPT> cat myprog/__init__.py
def init_myprog():
    print 'running __init__.init_myprog()'

PROMPT> cat myprog/__main__.py
import myprog
print 'hi from __main__.py'
myprog.init_myprog()

PROMPT> ls -l myprog
total 16
-rw-r--r--  1 iit    63B Aug 30 11:40 __init__.py
-rw-r--r--  1 iit    64B Aug 30 12:11 __main__.py

PROMPT> python myprog
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/Users/jon/dev/myprog/__main__.py", line 1, in <module>
    import myprog
ImportError: No module named myprog

The __init__.py仅当您导入时才加载package。相反,您将该目录视为script,通过执行目录。

但是,您仍然可以将包视为脚本,而不是目录。将目录视为一个包and作为主要脚本,通过使用-m switch:

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

Python:模块和打包 - 为什么 __init__.py 文件不在 __main__.py 之前执行? 的相关文章

  • python sqlite ValueError:无法解析日期时间字符串

    我有一个 txt 文件 用于填充 sqlite 表 FoodConsumed tb class FoodConsumed Tb db Model tablename foodconsumed tb id db Column db Integ
  • pycharm自动将制表符转换为空格

    我正在使用 pycharm IDE 进行 python 开发 它对于 django 代码来说工作得很好 因此怀疑将制表符转换为空格是默认行为 但是在 python IDE 中到处都会出现错误 因为它无法自动将制表符转换为空格 有没有办法实现
  • Python 元组列表到 int 列表

    所以我有x 12 1 3 元组列表 我想要x 12 1 3 整数列表 以最好的方式可能 你能帮忙吗 你没有说 最好 是什么意思 但大概你的意思是 最Pythonic 或 最易读 或类似的东西 F3AR3DLEGEND 给出的列表理解可能是最
  • 没有要聚合的数字类型 - groupby() 行为发生变化吗?

    我对一些团体代码有问题 我很确定这些代码曾经运行过 在较旧的 pandas 版本上 在 0 9 上 我得到没有要聚合的数字类型错误 有任何想法吗 In 31 data Out 31
  • Python Pandas:使用 groupby() 和 agg() 时顺序是否保留?

    我经常使用熊猫 agg 函数对 data frame 的每一列运行摘要统计 例如 以下是生成平均值和标准差的方法 df pd DataFrame A group1 group1 group2 group2 group3 group3 B 1
  • 在 scipy 中按稀疏矩阵分组并返回一个矩阵

    关于使用 SO 处理有几个问题groupby与稀疏矩阵 然而输出似乎是列表 字典 https stackoverflow com questions 35410839 group by on scipy sparse matrix 数据框
  • 使用 Matplotlib 和 TeX 实现均匀间距

    我正在为数学课绘制一些图表 但我无法在绘图图例中正确地获得和平定义的间距 我目前正在使用 对于 TeX 中的单个空间 但会遇到一种情况 其中一个空间比另一个空间稍远 这可能是由于左边的方程占用了多少空间 这是我的代码 import matp
  • 为什么线性读-混洗写并不比混洗读-线性写快?

    我目前正在尝试更好地了解内存 缓存相关的性能问题 我在某处读到 内存局部性对于读取比对于写入更重要 因为在前一种情况下 CPU 必须实际等待数据 而在后一种情况下 它可以将它们发送出去并忘记它们 考虑到这一点 我做了以下快速而肮脏的测试 我
  • 使用 ctypes 的 python 枚举模块

    之前enum模块已存在 c int或相关类型经常被用作替代枚举 但这没有也没有检查类型 现在 python 有一个enum模块 有没有办法直接使用它ctypes 是的 我们可以轻松创建自己的 CEnum 类 这要归功于 ctypes 允许我
  • 如何根据父字段的值限制子字段的选择?

    我有几个相当复杂的表单 它们依赖于模型层次结构来分配ForeignKey价值观 我需要根据其父字段的值限制子字段可用的选择 问题是父字段的值可能来自初始数据 GET 请求 or来自绑定数据 POST 请求 因此 我最终多次复制了这种模式 c
  • 姜戈 - 信号。简单的例子开始

    我是 Django 新手 无法理解如何使用 Django 信号 谁能解释一下 Django 信号 用简单的例子 提前致谢 通过做一些很小的研究 你可以在互联网上找到关于 django 信号的非常好的内容 在这里我将向您简要介绍 Django
  • python中带括号和不带括号调用函数有什么区别? [复制]

    这个问题在这里已经有答案了 我有个问题 假设我们有函数 hello 带括号和不带括号调用有什么区别 当我调用 hello 时 它引用的是一个值等于此函数的对象 或者也许我错了 当我不带括号调用它时会发生什么 我想知道为什么 def hell
  • 使用 pip freeze 安装 numpy

    I need to install Numpy version 1 17 1 but every time it just freezes I have now tried multiple times and I have been wa
  • 命令错误,退出状态 1: python setup.py Egg_info 检查日志以获取完整的命令输出 - 通过 pip 安装 auto-py-to-exe 时

    我正在尝试在与我通常通过 pip 使用不同的 Windows 设备上下载 auto py to exe 但是 当运行时 我收到错误 抱歉 它太长了 ERROR Command errored out with exit status 1 c
  • 查找框和裁剪图像的角点

    Hey Guys I am working with numpy and opencv and want to get a image cropped by the contours of it Here is one example wh
  • 持久子进程.Popen 会话

    我正在尝试运行一个命令 然后在同一环境中运行另一个命令 比如说 如果我在第一个命令中设置环境变量 我希望它可用于第二个命令 我试过这个 import subprocess process subprocess Popen echo test
  • Scrapy在使用crawlerprocess运行时抛出错误

    我用 python 编写了一个脚本 使用 scrapy 来收集网站上不同帖子的名称及其链接 当我从命令行执行脚本时 它可以完美地工作 现在 我的意图是使用运行脚本CrawlerProcess 我在不同的地方寻找类似的问题 但我找不到任何直接
  • 如何使用判别函数绘制 3 个类别之间的决策边界

    我有 3 个判别函数 将 2D 空间划分为 3 个区域 我想绘制这些区域之间的决策边界 我不知道如何在 python 中使用 matplotlib meshgrid 来做到这一点 对于2个判别函数 过程很简单 我计算值为 0 的函数和等高线
  • 使用具有阿拉伯字符的 json.dumps 将字典转换为 json [重复]

    这个问题在这里已经有答案了 我有一本包含阿拉伯语单词的字典 例如 data name name print json dumps data file open data json a encoding utf 8 Output name u
  • 从 pexpect 中提取 stderr

    我的问题很简单 我可以吗 expect 使用 pexpect 查看 stderr 上的某些输出 它似乎pexpect spawn 只能用于期望 stdout 上的输出 乌托邦的例子 import pexpect child pexpect

随机推荐