我试图通过将脚本从包目录移动到顶级脚本目录来重新组织我的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
?
答案 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;
}
。