从具有相同名称的脚本导入Python包

时间:2014-06-29 15:23:11

标签: 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已经存在安装到site-packages作为鸡蛋,我们的虚拟环境已正确激活。)

如果它们具有相同的名称,如何从脚本 my_package导入 my_package.py

其他技术信息:

  • Python 2.7.3
  • Ubuntu Server 12.04 LTS
  • VirtualEnv 1.11.6

2 个答案:

答案 0 :(得分:1)

对我而言,它适用于

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

因为导入的行为类似于for path in sys.path:

答案 1 :(得分:1)

您可能希望使用模块的核心脚本的规范名称my_package.py重命名__main__.py,并将其放回模块目录中。然后,还可以通过在setup.py文件中为my_package定义entry_point来自动生成my_package可执行文件。 Python Apps the Right Way: entry points and scripts, by Chris Warrick在某种程度上涵盖了这一点。

另请参阅What is main.py? - Stack Overflow,了解调用此python -m my_package的其他方法,这也会自动设置,例如std::vector<int> getOccupiedBucketIds(const cv::Rect& rect) { auto minBucketX = rect.x / bucketWidth; auto minBucketY = rect.y / bucketWidth; auto maxBucketX = (rect.x + rect.width) / bucketWidth; auto maxBucketY = (rect.y + rect.height) / bucketWidth; std::vector<int> occupiedBucketIds; occupiedBucketIds.reserve((maxBucketX - minBucketX + 1) * (maxBucketY - minBucketY + 1)); for (auto y = minBucketY; y <= maxBucketY; y++) { for (auto x = minBucketX; x <= maxBucketX; x++) { occupiedBucketIds.push_back(y * cellsPerSide + x); } } return occupiedBucketIds; }