从与脚本同名的包中导入Python包

16 投票
2 回答
2392 浏览
提问于 2025-04-18 11:30

我正在尝试重新组织我的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: 这样的操作。

撰写回答