编程语言
首页 > 编程语言> > python – 自动调用公共初始化代码而不创建__init__.py文件

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