我继承了相当多的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/