如何使用python子进程命令在不同的目录中运行shell命令?

如何使用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命令都不需要您在任何特定目录中运行它们,但如果这是您想要的,您可以这样

我正在尝试执行一个shell命令,例如“ls”位于与python脚本不同的目录中。直接从子进程的python代码更改目录时遇到问题。

子进程的
方法都接受
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(),如果您的命令引用了包含空格的字符串,则Plain
    split
    不起作用。有
    shlex.split()
    可以处理这个问题和其他复杂问题;但是再一次,也许你的答案应该解释清楚这些事情,或者至少要注意,总结这些差异并不完全是微不足道的。在GUI中,我将一个按钮连接到一个函数,该函数为不同目录中的特定make文件运行shell命令“makecheck”。这里的要点是makefile所在的目录不是固定的(可以是系统中的任何位置),因此首先我提取目录的位置并将其添加到变量中。我仍然需要尝试cwd命令,但我希望它能起作用,或者还有其他更简单、更有效的方法。另外,“ls”只是一个例子,肯定没有列出子流程的内容。
    make-C目录检查
    也应该可以。也就是说,
    subprocess.run(['make','-C',directory,'check'])
    我们假设
    directory
    是一个包含目录路径的变量。