【问题标题】:How to run shell commands in different directory using python subprocess command?如何使用 python 子进程命令在不同目录中运行 shell 命令?
【发布时间】:2020-09-27 08:00:36
【问题描述】:

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

【问题讨论】:

标签: python subprocess


【解决方案1】:

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 作为外部命令的示例。)

【讨论】:

  • 好的,更具体地说,我正在用 python 构建一个 GUI。在 GUI 中,我将一个按钮连接到一个函数,该函数为不同目录中的特定 make 文件运行 shell 命令“make check”。这里的重点是makefile所在的目录不是固定的(可以在系统中的任何地方),所以我首先提取目录的位置并将其添加到变量中。我仍然必须尝试 cwd 命令,但我希望它可以工作,或者是否有任何其他简单且更有效的方法来做到这一点。同样“ls”只是一个例子,绝对不会列出子进程的内容。
  • make -C directory check 也应该可以工作。也就是说,subprocess.run(['make', '-C', directory, 'check']) 我们假设 directory 是一个包含目录路径的变量。
【解决方案2】:

要为三人组添加出色的答案,您可以通过 3 种方式解决此问题:

  1. 使用子进程'cwd 参数
  2. 之前更改目录,使用os.chdir
  3. 将 shell 命令运行到您想要的确切目录,例如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=True,您通常会传入一个字符串并让shell解析它,例如ls /home/you/Desktop 可以正常工作。如果没有shell=True,您需要自己将其拆分为一个列表; ['ls', '/home/you/Desktop']
  • 我总是传递 ls bla bla 这样的字符串。添加 shell True 时,我保持原样,当它为 false 时,我添加 split()
  • Plain split 如果您的命令引用了包含空格的字符串,则该字符串不起作用。有shlex.split() 可以处理这个和其他并发症;但同样,也许你的答案应该说明这些事情,或者至少要注意总结差异并非完全微不足道。
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多