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

标签 python module python-module

我有一个完全包含在具有以下结构的目录中的 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

最佳答案

__init__.py 仅在导入 时加载。相反,您通过执行目录将目录视为脚本

您仍然可以将包视为脚本,而不是目录。通过使用 -m 开关,既要将目录视为包 又要将 视为主脚本:

python -m myprog

关于Python:模块和打包 - 为什么 __init__.py 文件不在 __main__.py 之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18536462/

相关文章:

python - 我如何在 opencv 3 中运行 CV_DIST_L2?

java - mvn编译错误: error reading jar error in opening zip file

python - 从包导入时模块抛出名称错误

python - 无法在spyder上导入sklearn

python - AsyncGenerator 上的异步 for 循环

python - 为 Django + Celery + RabbitMQ 预订?

python - pip 未使用 pip.conf 中定义的额外索引 url

python - 如何将多个 py 文件编译为一个文件?

java - 如何从android studio中的库模块调用 Activity

python - 如何在 Python 中获取 __main__ 模块的文件名?