如何使用python子进程命令在不同的目录中运行shell命令?
我正在尝试执行一个shell命令,例如“ls”位于与python脚本不同的目录中。直接从子进程的python代码更改目录时遇到问题。子进程的如何使用python子进程命令在不同的目录中运行shell命令?,python,subprocess,Python,Subprocess,我正在尝试执行一个shell命令,例如“ls”位于与python脚本不同的目录中。直接从子进程的python代码更改目录时遇到问题。子进程的方法都接受cwd关键字参数 import subprocess d = subprocess.check_output( ['ls'], cwd='/home/you/Desktop') 显然,将/home/you/Desktop替换为所需的实际目录 大多数编写良好的shell命令都不需要您在任何特定目录中运行它们,但如果这是您想要的,您可以这样
方法都接受cwd
关键字参数
import subprocess
d = subprocess.check_output(
['ls'], cwd='/home/you/Desktop')
显然,将/home/you/Desktop
替换为所需的实际目录
大多数编写良好的shell命令都不需要您在任何特定目录中运行它们,但如果这是您想要的,您可以这样做
如果这不能解决您的问题,请更新您的问题,使其包含与您期望的行为不符的实际代码
(当然,如果您真的想使用子进程,那么子进程是获取目录列表的一种非常糟糕的方法。如果您真的需要,可以尝试os.listdir('/home/you/Desktop')
。但我猜您只是提供了ls
作为外部命令的示例。)要添加到三重答案中,您可以通过三种方式解决此问题:
使用子流程“cwd
参数
使用os.chdir
将shell命令运行到所需的确切目录,例如ls/path/to/dir
或cd/path/to/dir;ls
,但请注意,如果不向方法调用中添加shell=True
,则无法使用某些shell指令(例如&&&、;)
PS正如tripleee评论的那样,不鼓励使用shell=True
,在使用它时,有很多事情需要考虑你想要实现什么?你可以发布一些你尝试过的示例代码吗?这是否回答了你的问题<代码>代码>也是其中之一。如果可以的话,你真的想避免shell=True
;看,我同意shell=True不太理想。我只想在这里展示各种可能性。实际上,我是从最好的到最坏的顺序来订购的,然而,有些情况下可以从它的安全性中获益,只是你可以掩饰它的复杂性。使用shell=True
时,您通常会传入一个字符串,并让shell对其进行解析,因此,例如ls/home/you/Desktop
可以正常工作。如果没有shell=True
,您需要自己将其拆分为一个列表['ls','/home/you/Desktop']
我总是像ls-bla-bla
那样传递字符串。当添加shell True时,我保持原样,当它为false时,我添加split(),如果您的命令引用了包含空格的字符串,则Plainsplit
不起作用。有shlex.split()
可以处理这个问题和其他复杂问题;但是再一次,也许你的答案应该解释清楚这些事情,或者至少要注意,总结这些差异并不完全是微不足道的。在GUI中,我将一个按钮连接到一个函数,该函数为不同目录中的特定make文件运行shell命令“makecheck”。这里的要点是makefile所在的目录不是固定的(可以是系统中的任何位置),因此首先我提取目录的位置并将其添加到变量中。我仍然需要尝试cwd命令,但我希望它能起作用,或者还有其他更简单、更有效的方法。另外,“ls”只是一个例子,肯定没有列出子流程的内容。make-C目录检查
也应该可以。也就是说,subprocess.run(['make','-C',directory,'check'])
我们假设directory
是一个包含目录路径的变量。