gpt4 book ai didi

python - 不创建__init__.py文件自动调用普通初始化代码

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:01 25 4
gpt4 key购买 nike

我的项目中有两个目录:

project/
src/
scripts/

“src”包含我完善的代码,“scripts”包含一次性 Python 脚本。

我希望所有脚本都将“../src”添加到它们的 sys.path 中,以便它们可以访问“src”树下的模块。一种方法是编写一个 scripts/__init__.py 文件,其内容为:

scripts/__init__.py:
import sys
sys.path.append("../src")

这行得通,但会产生不良副作用,将我的所有脚本都放在一个名为“scripts”的包中。有没有其他方法可以让我所有的脚本自动调用上面的初始化代码?

我可以只在我的 .bashrc 中编辑 PYTHONPATH 环境变量,但我希望我的脚本开箱即用,而不需要用户摆弄 PYTHONPATH。此外,我不喜欢为了适应这个项目而必须在帐户范围内进行更改。

最佳答案

即使您有其他分发计划,也可能值得整理一个基本的 setup.py在您的 src 文件夹中。这样,您可以运行 setup.py develop 让 distutils 将您的代码的链接 放到您的默认路径上(这意味着您所做的任何更改都将在没有必须“重新安装”,所有模块都将“正常工作”,无论您的脚本在哪里)。这将是一次性步骤,但这仍然比零步骤多一步,所以这取决于它是否比更新 .bashrc 更麻烦。如果你使用 pip ,等同于 pip install -e/path/to/src

更可靠的解决方案——特别是如果您要在多个开发人员的机器上镜像/控制这些脚本——是在受控的虚拟环境中进行开发工作。结果 virtualenv 甚至内置了 support for making your own bootstrap customizations .看起来你只需要一个 after_install() Hook 来调整 sitecustomize,运行 pip install -e,或者添加一个普通的 .pth 文件到站点包。自定义 Bootstrap 可以与其他脚本一起存在于您的源代码管理中,并且需要为每个开发人员的设置运行一次。您还可以获得使用 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 所说,那时你真的在与语言作斗争。

关于python - 不创建__init__.py文件自动调用普通初始化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com