jon*_*omo 11 python module python-module
我有一个完全包含在具有以下结构的目录中的python程序:
myprog/
??? __init__.py
??? __main__.py
??? moduleone.py
??? moduletwo.py
Run Code Online (Sandbox Code Playgroud)
我希望能够打包并分发它,以便其他开发人员可以做pip install -e /path/to/git/clone/of/myprog,然后可以在他自己的程序中导入myprog并用它做很酷的事情.
我还希望能够在命令行运行myprog,如下所示:
PROMPT> python myprog
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我希望python能够执行__main__.py它所执行的模块.但是,此模块引用了一些声明的函数,这些函数__init__.py在程序在命令行运行时以及由另一个程序导入时都需要可用.但是,我收到以下错误:
NameError: name 'function_you_referenced_from_init_file' is not defined
Run Code Online (Sandbox Code Playgroud)
我必须以__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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 14
在__init__.py当你导入只装包.您可以通过执行目录将目录视为脚本.
您仍然可以将程序包视为脚本,而不是目录.要将目录视为包和主脚本,请使用-m开关:
python -m myprog
Run Code Online (Sandbox Code Playgroud)
我必须以
__main__某种方式导入这些功能吗?
是.只有builtins没有导入的项目可用.就像是:
from myprog import func1, func2
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.
如果你没有myprog安装在普通的python路径中,那么你可以用以下方法解决它:
import sys
import os
path = os.path.dirname(sys.modules[__name__].__file__)
path = os.path.join(path, '..')
sys.path.insert(0, path)
from myprog import function_you_referenced_from_init_file
Run Code Online (Sandbox Code Playgroud)
坦率地说,这很可怕.
我建议使用MartijnPieters建议并将-m命令放在命令行上,在这种情况下__main__.py看起来像:
from myprog import function_you_referenced_from_init_file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6843 次 |
| 最近记录: |