python – 自动调用公共初始化代码而不创建__init__.py文件
作者:互联网
我的项目中有两个目录:
project/
src/
scripts/
“src”包含我的优秀代码,“脚本”包含一次性Python脚本.
我希望所有脚本都将“../src”添加到他们的sys.path中,以便他们可以访问“src”树下的模块.一种方法是编写一个scripts / __ init__.py文件,其中包含以下内容:
scripts/__init__.py:
import sys
sys.path.append("../src")
这有效,但是将所有脚本放在名为“scripts”的包中会产生不必要的副作用.有没有其他方法让我的所有脚本自动调用上面的初始化代码?
我可以在我的.bashrc中编辑PYTHONPATH环境变量,但是我希望我的脚本可以开箱即用,而不需要用户使用PYTHONPATH.此外,我不想仅仅为了适应这个项目而进行帐户范围的更改.
解决方法:
即使您有其他分发计划,也可能值得在您的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文件添加到site-packages.自定义引导程序可以与其他脚本一起存在于源代码管理中,并且需要为每个开发人员的设置运行一次.您还可以享受使用virtualenv(显式依赖版本控制,与系统范围配置隔离以及不同机器之间的标准化等)的正常好处.
如果你真的不想做任何设置步骤并且只愿意从’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
谨防!只能从project /中调用脚本:
[~/otherdir] $python -m scripts.some_script
ImportError: no module named scripts
要启用它,您将返回编辑.bashrc或使用上述选项之一.最后一个选项应该是最后的选择;正如@Simon说的那样,那时你真的在与语言作斗争.
标签:python,scripting,python-module,pythonpath 来源: https://codeday.me/bug/20190630/1337445.html