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,但您可能会这样做。这一切都取决于你。
在 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,但您可能会这样做。这一切都取决于你。