【问题标题】:Best way to execute 'ls' shell command with multiple arguments?使用多个参数执行“ls”shell 命令的最佳方法?
【发布时间】:2016-06-01 16:34:47
【问题描述】:

我想在 Python 中执行以下命令并将其存储在变量中:

ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1

但我无法让它工作。我尝试使用子进程('call'和'check_output'以及'os.system'都没有工作。它总是给我一个错误或错误的输入,而当我在shell中执行这个命令时它可以正常工作。

【问题讨论】:

  • 顺便说一句,这通常是非常糟糕的形式,即使在本机 shell 中也是如此——正如 mywiki.wooledge.org/ParsingLs 中所讨论的那样——在 Python 中更是如此,在 Python 中有用于迭代目录树的本机工具。并非所有可能的文件名都可以在换行符分隔的流中表示,因此必然存在ls 会错误表示的名称。
  • 如果你想调用一堆shell命令,shell脚本会比Python程序更合适。如果你想写 Python,你应该使用像 os.listdir 这样的工具和 Python 自己的字符串匹配工具。
  • 查尔斯·达菲说的。另请参阅 Unix 和 Linux 上Why not parse ls? 的答案。
  • 谢谢你们,我一定会记住的。
  • 如果您担心脚本的可移植性,您应该绝对避免解析ls 的输出! ls 在野外有很多变体,即使在一台机器上,它的输出也会根据各种环境变量的设置而改变。

标签: python shell


【解决方案1】:

要执行 shell 命令,您需要使用 subprocess 模块。

用法和示例可以在以下位置找到: Python Docs: subprocess

调用 bash 的实际 Python 代码如下所示

import subprocess
task = subprocess.Popen("ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1",
                        shell=True, 
                        stdout=subprocess.PIPE)
directory = task.stdout.read()
print(directory) # result

推荐的方法是使用 python 进行目录搜索。 Python listdir() oslistdir 的命令可能如下所示

files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]

【讨论】:

  • 对于这个特定的案例,我决定使用 python 的 'os' 模块来实现脚本的可移植性,但是你的回答很好,对以后的任务很有用,谢谢!
  • 使用 Py3,您只需使用 subprocess.check_output 就可以简化,因为 OP 使用的是 head -n 1,看起来他们只想要第一个结果,所以只需将其分配给一个变量。
【解决方案2】:

我在使用subprocess时没有任何问题:

>>> import subprocess
>>> sub = subprocess.Popen("ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1", shell=True, stdout=subprocess.PIPE)
>>> str = sub.stdout.read()
>>> str
''

您可以在保存输出 here 时找到有关调用 shell 命令的其他信息。

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    您需要确保在 shell 中执行,因为您依赖 shell 来调度管道,例如(Py>3.1):

    import subprocess
    var1, var2, var3 = "var1", "var2", "var3"
    cmd = "ls -1 {} 2>/dev/null | grep {} | grep {} | head -n 1".format(var1, var2, var3)
    result = subprocess.check_output(cmd, shell=True)
    

    【讨论】:

    • 如果var1var2var3 中的任何一个包含任何空格或全局元字符,这将无法正常工作。
    • 鉴于 OP 的原始问题使用这些变量,假设似乎很奇怪
    • 原问题使用文字字符串;您将它们更改为 Python 变量。
    • 没错,就我而言,假设它们是被替换的变量——默认变量为文字......
    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2015-12-28
    • 2023-01-03
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多