【发布时间】:2020-09-27 08:00:36
【问题描述】:
我正在尝试执行一个 shell 命令,例如与我的 python 脚本不同的目录中的“ls”。我在直接从子进程中的 python 代码更改目录时遇到问题。
【问题讨论】:
-
你想达到什么目的可以请你发布一些你尝试过的示例代码吗?
标签: python subprocess
我正在尝试执行一个 shell 命令,例如与我的 python 脚本不同的目录中的“ls”。我在直接从子进程中的 python 代码更改目录时遇到问题。
【问题讨论】:
标签: python subprocess
subprocess 方法都接受 cwd 关键字参数。
import subprocess
d = subprocess.check_output(
['ls'], cwd='/home/you/Desktop')
显然,将/home/you/Desktop 替换为您想要的实际目录。
大多数编写良好的 shell 命令不会要求您在任何特定目录中运行它们,但如果这是您想要的,那么您就是这样做的。
如果这不能解决您的问题,请更新您的问题以包含与您预期不同的实际代码。
(当然,子进程是获取目录列表的一种非常糟糕的方法,如果你真的想使用子进程,ls is a really poor way to get a directory listing。如果你真正想要的话,可能试试os.listdir('/home/you/Desktop')。但我猜您只是提供ls 作为外部命令的示例。)
【讨论】:
make -C directory check 也应该可以工作。也就是说,subprocess.run(['make', '-C', directory, 'check']) 我们假设 directory 是一个包含目录路径的变量。
要为三人组添加出色的答案,您可以通过 3 种方式解决此问题:
cwd 参数os.chdir
ls /path/to/dir 或 cd /path/to/dir; ls,但请注意,如果不将 shell=True 添加到方法调用中,则无法使用某些 shell 指令(例如 &&、;)PS 正如tripee 所说,不鼓励使用shell=True,使用时需要考虑很多事情
【讨论】:
; 也在其中。如果可以的话,你真的想避免shell=True;见Actual meaning of shell=True in subprocess
shell=True,您通常会传入一个字符串并让shell解析它,例如ls /home/you/Desktop 可以正常工作。如果没有shell=True,您需要自己将其拆分为一个列表; ['ls', '/home/you/Desktop']
ls bla bla 这样的字符串。添加 shell True 时,我保持原样,当它为 false 时,我添加 split()
split 如果您的命令引用了包含空格的字符串,则该字符串不起作用。有shlex.split() 可以处理这个和其他并发症;但同样,也许你的答案应该说明这些事情,或者至少要注意总结差异并非完全微不足道。