从与脚本同名的包中导入Python包
我正在尝试重新组织我的Python项目,把一些脚本从包目录移动到顶层的脚本目录。经过这些调整后,我的项目结构看起来是这样的:
MyProject/
setup.py
scripts/
my_package.py
my_package/
__init__.py
module_foo.py
注意到这个脚本和包的名字是一样的。
脚本 my_package.py
大概是这样的:
# MyProject/scripts/my_package.py
import os
try:
import my_package
print os.path.abspath(my_package.__file__)
except ImportError as e:
print e
当我们运行上面的脚本时,解释器会导入当前的模块,而不是同名的包(注意:包 my_package
已经作为一个egg安装到了 site-packages
中,并且我们的虚拟环境也已经正确激活。)
那么,如何从脚本 my_package.py
中导入包 my_package
,因为它们的名字是一样的呢?
其他技术信息:
- Python 2.7.3
- Ubuntu Server 12.04 LTS
- VirtualEnv 1.11.6
2 个回答
1
你可能想把 my_package.py
这个文件重命名成一个标准的名字,也就是 __main__.py
,然后把它放回你的模块目录里。接着,还需要在你的 setup.py
文件中定义一个 entry_point
,这样就能自动生成 my_package
的可执行文件。
关于这个内容,Chris Warrick 的博客《Python 应用的正确方式:入口点和脚本》 讲得比较详细。
你还可以查看 什么是 main.py? - Stack Overflow,了解一些其他调用 my_package
的方式,比如 python -m my_package
,这些方式也是自动设置好的。
1
对我来说,这个方法有效:
sys.path.insert(0, '..')
因为这个导入的过程就像在执行 for path in sys.path:
这样的操作。