【问题标题】:Importing a Python package from a script with the same name从同名脚本导入 Python 包
【发布时间】:2014-08-20 01:52:26
【问题描述】:

我正在尝试通过将脚本从包目录移动到顶级脚本目录来重新组织我的 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已经安装到site-packages 作为鸡蛋,我们的虚拟环境已正确激活。)

如果 my_packagescript my_package.py 中导入它们具有相同的名称,我该如何?

其他技术信息:

  • Python 2.7.3
  • Ubuntu 服务器 12.04 LTS
  • 虚拟环境 1.11.6

【问题讨论】:

  • 更改脚本名称 - 这是最简单的解决方案。
  • 你在调用import my_package之前尝试添加os.path.append("..")
  • @furas 重命名脚本真的是我唯一的选择吗?根据我对“绝对导入”功能的了解,我使用的导入语法应该有效。
  • @user8708 我试过 sys.path.append('..') 没有运气。
  • @AlfaZulu 你的my_package 应该在scripts 内以覆盖路径

标签: python


【解决方案1】:

对我来说,它适用于

sys.path.insert(0, '..')

因为导入做了类似for path in sys.path:.

【讨论】:

    【解决方案2】:

    您可能想要重命名my_package.py,使用模块核心脚本的规范名称:__main__.py,并将其放回您的模块目录中。然后通过在setup.py 文件中为它定义一个entry_point 来安排自动生成my_package 可执行文件。 Python Apps the Right Way: entry points and scripts, by Chris Warrick 对此进行了深入探讨。

    另请参阅 What is main.py? - Stack Overflow 以查看调用 my_package 的其他一些方式,这也是自动设置的,例如 python -m my_package

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多