即使您有其他分发计划,也值得在您的src 文件夹中放置一个基本的setup.py。这样,您可以运行 setup.py develop 让 distutils 将您的代码的 链接 放到您的默认路径上(这意味着您所做的任何更改都将在原地反映,而无需“重新安装”,并且所有无论您的脚本在哪里,模块都将“正常工作”)。这将是一次性步骤,但这仍然比零多一步,所以这取决于这是否比更新.bashrc 更麻烦。如果您使用pip,则等效为pip install -e /path/to/src。
更强大的解决方案 - 特别是如果您要在多个开发人员的机器上镜像/版本控制这些脚本 - 是在受控的虚拟环境中完成您的开发工作。事实证明 virtualenv 甚至内置了support for making your own bootstrap customizations。似乎您只需要一个 after_install() 挂钩来调整 sitecustomize、运行 pip install -e 或将一个普通的 .pth 文件添加到站点包。自定义引导程序可以与其他脚本一起存在于您的源代码管理中,并且需要为每个开发人员的设置运行一次。您还可以获得使用 virtualenv 的正常好处(显式依赖版本控制、与系统范围的配置隔离以及不同机器之间的标准化等等)。
如果您真的不想进行任何设置步骤并且愿意仅从“项目”目录中运行这些脚本,那么您可以扑通一声在__init__.py 中:
project/
src/
some_module.py
scripts/
__init__.py # special "magic"
some_script.py
这些是您的文件的样子:
# file: project/src/some_module.py
print("importing %r" % __name__)
def some_function():
print("called some_function() inside %s" % __name__)
--------------------------------------------------------
# file: project/scripts/some_script.py
import some_module
if __name__ == '__main__':
some_module.some_function()
--------------------------------------------------------
# file: project/scripts/__init__.py
import sys
from os.path import dirname, abspath, join
print("doing magic!")
sys.path.insert(0, join(dirname(dirname(abspath(__file__))), 'src'))
然后你必须像这样运行你的脚本:
[~/project] $ python -m scripts.some_script
doing magic!
importing 'some_module'
called some_function() inside some_module
小心!脚本只能从project/内部这样调用:
[~/otherdir] $ python -m scripts.some_script
ImportError: no module named scripts
要启用此功能,您需要返回编辑 .bashrc,或使用上述选项之一。最后的选择应该是最后的手段;正如@Simon 所说,那时你真的在与语言作斗争。