【问题标题】:Running a "piping" script from an os.system() command从 os.system() 命令运行“管道”脚本
【发布时间】:2015-03-30 12:01:15
【问题描述】:

我目前有一个脚本(“监视器”),它监视各种系统类型的数据并将其输出到屏幕上。我有一个 Python 程序,当我使用此命令将监视器输出通过管道传输到我的 Python 程序时,它会对该信息进行后处理。

/usr/local/bin/monitor | /mnt/usbkey/pgms/myMonitorPgm.py

这一切都很好。

我想使用 os.system 命令(或其他命令??)来运行监控脚本并从我的 Python 程序中创建管道。这将在我启动我的 Python 程序时运行,从而消除对上述管道格式/命令的需要。

这可能吗?

【问题讨论】:

    标签: python pipe


    【解决方案1】:

    您可能应该查看 subprocess 模块,特别是使用 stdout=PIPE 创建一个 Popen 对象,然后您可以使用communicate() 或类似方法从 Python 程序中的管道读取。

    例如,你可以这样做:

    import subprocess
    proc = subprocess.Popen( [ '/usr/local/bin/monitor' ], stdout=subprocess.PIPE )
    stdout, _ = proc.communicate()
    

    现在 stdout 将有运行监控程序的输出。

    【讨论】:

    • Eric...我尝试了以下操作:#!/usr/bin/env python import subprocess tcpdmp = subprocess.Popen(["sudo tcpdump -A -n -p -l -i eth0 -s0 -w - tcp dst port 80"], stdout=subprocess.PIPE, ) 并收到此错误:Traceback(最近一次调用最后一次):文件“/mnt/usbdrive/Pgms/TestPipe.py”,第 6 行,在 stdout=subprocess.PIPE,文件“/usr/lib/python2.7/subprocess.py”,第 679 行,在 init errread, errwrite) 文件“/usr/lib/python2 .7/subprocess.py",第 1259 行,在 _execute_child raise child_exception OSError: [Errno 2] No such file or directory 我做错了什么?谢谢...RDK
    • 您尝试的问题是,如果您没有在 Popen 构造函数中指定 shell=True ,则需要传入一个列表(或元组),其中每个元素都是一个参数,所以第一个thing 是可执行文件,然后列表的其余元素是参数,例如 [ 'sudo', 'tcpdump', '-A', '-n', '-p', '-l', ' -i', 'eth0', ...] 等等
    • 我在 Raspberry Pi 上运行它,脚本在命令提示符下运行良好
    • 对,但是子进程调用命令的方式是有问题的。 subprocess.Popen 的第一个参数是参数列表,而不是包含要运行的命令的字符串——除非您在构造函数中指定 shell=True,否则第一个参数是传递给 shell 以执行的字符串。
    • 谢谢埃里克。该程序的那部分现在似乎正在工作,或者至少没有抛出错误。我将再次发布一个后续问题。再次感谢.....RDK
    【解决方案2】:

    就我而言,有效的是:

    with open('/tmp/mailbody', 'w') as f:
        f.write(body)
    os.system('/usr/bin/heirloom-mailx -s ' + subject + ' ' + mail + '< /tmp/mailbody')
    

    【讨论】:

      最近更新 更多