python - 不断添加路径到sys.path

标签 python

我继承了相当多的Python代码,上面都是以下代码片段,它将父目录的文件路径添加到系统路径中。

from os.path import join, dirname
sys.path.insert(0, join(dirname(sys.argv[0]), "..\\"))
from utilities import find, execute

我对此的理解是,它在搜索路径中添加了一条路径。在程序运行期间,这会向搜索路径添加大量路径,并且可能会使其速度变慢。当每个文件添加它自己的父目录时。

我更喜欢这种语法

from scm_tools.general.utilities import find, execute

因为这更容易理解并且代码更少。如果我移动代码,但它都在一个包中,这可能会产生影响。

我是否正确地假设在包内后一种语法是更Pythonic的做事方式?

或者这并不重要,因为Python在幕后正在做一些魔法?

最佳答案

尽可能使用相对导入:

from ..utilities import find, execute

这要求您留在模块空间内,这意味着您遍历的每个目录都需要 __init__.py文件。

在某些情况下,这种情况会发生故障,例如,如果您的测试目录不在模块结构内。在这些情况下,您需要编辑路径,但您不应该像上面的示例一样盲目地编辑路径。

添加到 PYTHONPATH在代码开始之前添加环境变量,以便您始终可以引用目录的根目录或仅添加 sys.path 中尚未存在的路径。并尝试避免添加除模块根之外的任何内容。

PYTHONPATH对于您想要分发的代码来说,更改有点冒险。更改PYTHONPATH很容易您无法控制或不以传输到分布式代码的方式定义该添加。它还添加了其他人必须处理的恼人的模块要求 - 因此保留它以添加您想要包含的整个模块,例如自定义站点包目录。对于这种情况,使用 virtualenv 几乎总是更好。

如果您确实需要更改 sys.path在代码内部,你至少应该尽量避免把它弄得到处都是,否则当它出错时你会很头疼地试图修复它。为了避免这种情况,请尝试仅添加根模块路径,以便您始终可以导入 root.submodule.desiredmodule图案。另外,在将路径插入 sys.path 之前检查路径是否已存在。避免太长sys.path s。在我的测试目录中,我经常有一个可导入文件来修复 sys.path到我正在测试的目录结构的根目录:

# Add parent import capabilities
parentdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if parentdir not in sys.path:
    sys.path.insert(0, parentdir)

关于python - 不断添加路径到sys.path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34930662/

相关文章:

python - 覆盖范围和 flake8 的内嵌注释指令

python - Pandas 数据读取器 : normalizing dates

python - 我应该把我的 python 脚本放在 Linux 中的什么地方?

python - 服务器不支持 STARTTLS 扩展

python - 将较低的值分配给字典中的键

python - brew install ffmpeg 安装 python 3.9

python - 配置向上和向下箭头以在 Python shell 中滚动历史记录

php - 从 API (oauth2) 获取访问 token

python - Docker NLTK 下载

python - Django:使用 sudo 在虚拟环境中运行服务器