Python 子进程模块如何找到 运行 的可执行文件?我可以更改位置吗?

How does the Python subprocess module find executables to run? Can I change the location?

在 Linux 系统上,subprocess.run(["some_command"]) 似乎默认为 some_command 抓取 /usr/bin,因此,subprocess 接受每个命令在此目录中也有相应的二进制文件。

我现在有一个用例,我在多个目录中有二进制文件,我想用 subprocess 模块执行其中的一些。显然,我可以这样做:

subprocess.run(["/absolute/path/to/first_binary"])
subprocess.run(["/another/absolute/path/to/another/second_binary"])

但我想知道是否存在这样的东西:

subprocess.set_bin_dirs(["/usr/bin/", "/absolute/path/to/", "/another/absolute/path/to/another/"]) 
subprocess.run(["first_binary"]) 
subprocess.run(["second_binary"])

这与Python和subprocess模块无关。这是关于 Unix-like(和其他)操作系统如何工作的核心思想,当您执行 some_command 时,将在您的 PATH 上查找该命令。因此,您必须将这些二进制文件的目录添加到 PATH,否则,当您尝试执行命令时,您需要使用完整路径,例如/usr/bin/some_command

要在 Python 中使用 subprocess 模块执行此操作,您可以执行以下操作:

import os
env_copy = os.environ.copy()
current_path = current_env['PATH']

env_copy["PATH"] = os.pathsep.join([
    "/usr/bin/", 
    "/absolute/path/to/", 
    "/another/absolute/path/to/another/", 
    current_path
])

subprocess.run(["some_command"], env=env_copy)

请注意,路径是按顺序查找的,因此如果可能的话,附加路径的顺序很重要 name-collisions。请注意,您实际上不必添加当前的 PATH,但您可能会这样做。这一切都取决于你。