如何使用 bash 让我的 Python 脚本工作?

How can I get my Python script to work using bash?

我是这个网站的新手,希望这是提出这个问题的正确位置。

我正在尝试使用 python 为 Linux 编写脚本,即:

  1. 创建一个文件file.txt
  2. 'lsof' 命令的输出附加到 file.txt
  3. 读取输出的每一行并将它们追加到一个数组中。
  4. 然后打印每一行。

我这样做基本上只是为了让自己熟悉使用 python 作为 bash,我是这个领域的新手,所以任何帮助都会很好。我不确定从这里去哪里。另外,如果有更好的方法来做到这一点,我愿意接受!

#!/usr/bin/env python
import subprocess

touch = "touch file.txt"
subprocess.call(touch, shell=True)
xfile = "file.txt"

connection_count = "lsof -i tcp | grep ESTABLISHED | wc -l"
count = subprocess.call(connection_count, shell=True)

if count > 0:
    connection_lines = "lsof -i tcp | grep ESTABLISHED >> file.txt"

subprocess.call(connection_lines, shell=True)

with open(subprocess.call(xfile, shell=True), "r") as ins:
    array = []
    for line in ins:
        array.append(line)

for i in array:
    print i

subprocess.call returns 已启动进程的 return 代码(bash 中的 $?)。这几乎肯定不是您想要的——并解释了为什么这一行几乎肯定会失败:

with open(subprocess.call(xfile, shell=True), "r") as ins:

(不能开号)

您可能希望将 subprocess.Popenstdout=subprocess.PIPE 一起使用。然后你可以从管道中读取输出。例如要计数,您可能需要类似的东西:

connection_count = "lsof -i tcp | grep ESTABLISHED"
proc = subprocess.POPEN(connection_count, shell=True, stdout=subprocess.PIPE)
# line counting moved to python :-)
count = sum(1 for unused_line in proc.stdout)

(你也可以在这里使用Popen.communicate

请注意,过度使用 shell=True 对我来说总是有点可怕...如 documentation.

中所示,将管道链接在一起会好得多