即使您有其他分发计划,也可能值得整理一个基本的计划setup.py http://docs.python.org/distutils/setupscript.html在你的src
文件夹。这样你就可以运行setup.py develop
让 distutils 放一个link将您的代码添加到默认路径中(这意味着您所做的任何更改都将就地反映,而无需“重新安装”,并且无论您的脚本位于何处,所有模块都将“正常工作”)。这将是一次性步骤,但这仍然比零多一步,所以这取决于这是否比更新更麻烦.bashrc
。如果你使用pip http://pypi.python.org/pypi/pip,等价于pip install -e /path/to/src
.
更强大的解决方案(特别是如果您要在多个开发人员的计算机上镜像/版本控制这些脚本)是在受控的虚拟环境中进行开发工作。事实证明 virtualenv 甚至内置了支持进行您自己的引导程序自定义 http://pypi.python.org/pypi/virtualenv/1.6.4#creating-your-own-bootstrap-scripts。看来你只需要一个after_install()
挂钩任一调整sitecustomize
, run pip install -e
,或者添加一个普通的.pth
文件到站点包。自定义引导程序可以与其他脚本一起存在于源代码管理中,并且需要为每个开发人员的设置运行一次。您还可以获得使用 virtualenv 的正常好处(显式依赖版本控制、与系统范围配置的隔离以及不同计算机之间的标准化等)。
If you really不想进行任何设置步骤并且愿意only从“project”目录中运行这些脚本,然后你可以扑通一声__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
谨防!脚本可以only从内部这样称呼project/
:
[~/otherdir] $ python -m scripts.some_script
ImportError: no module named scripts
要启用此功能,您需要返回编辑.bashrc
,或使用上述选项之一。最后一个选择确实应该是最后的手段;正如@Simon 所说,那时你真的在与语言作斗争。