【问题标题】:Submit results of a bash command to python script as sys.argv[1:]将 bash 命令的结果作为 sys.argv[1:] 提交到 python 脚本
【发布时间】:2014-06-12 12:44:22
【问题描述】:

我有一个很长的用作输入的文件列表。我在看文件输入模块,它似乎有一些吸引人的功能,[https://docs.python.org/3/library/fileinput.html][1]

但是如果不手动输入每个文件名,我无法弄清楚如何使用它,这会非常长。

我想做的是提交类似的东西

python myscript.py (ls -d -1 dir/* | grep summary.txt)

或者我可以将相同的 bash 命令推送到 filelist.txt 并以这种方式提交;无论哪种方式,诀窍都是无需键入每个文件即可提交。

【问题讨论】:

  • 也许这会起作用:ls -d -1 dir/* | xargs grep summary.txt | xargs python myscript.py
  • 您可能不应该调用外部实用程序来生成开头的文件名。 Python 完全有能力做到这一切。也不要在程序中使用use ls output
  • summary.txt的内容是什么?在任何情况下都不应处理ls 的输出。 (另外,grep 从标准输入读取文件参数,而不是两者。)
  • @chepner - 为什么“在任何情况下”你能帮我理解为什么这是不好的做法?

标签: python bash argv sys


【解决方案1】:

您可以使用os packagesubprocess。您只需要弄清楚您需要在终端中运行的确切命令,然后读取并拆分它。

import os
files = os.popen('ls').read()
# "file1\nfile2\nfile3\nfile4"
files.rsplit()
# ['file1', 'file2', 'file3', 'file4']

现在您有了一个可以传递给函数的输入列表

【讨论】:

  • 使用os.listdir 而不是ls 的管道。
【解决方案2】:

我很确定你不能为此使用sys.argv尝试使用subprocess.Popen()

import subprocess
args = subprocess.Popen(['ls', '-d', '-1', 'dir/*', '|', 'grep', 'summary.txt'], stdout=subprocess.PIPE)
out, err = args.communicate()
#Do something with out

【讨论】:

  • 这行不通。 ls 不理解 glob,绝对不能创建管道或执行 grep 实用程序。你应该执行一个 shell(或者更好,这个简单的任务根本不依赖外部程序)。
猜你喜欢
  • 2012-08-09
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2017-12-29
  • 2021-07-08
相关资源
最近更新 更多