为啥python3不能执行一些linux命令?

Posted

技术标签:

【中文标题】为啥python3不能执行一些linux命令?【英文标题】:Why python3 can't execute some linux command?为什么python3不能执行一些linux命令? 【发布时间】:2019-10-31 03:02:49 【问题描述】:

我可以使用 raspberry-pi 3 终端执行 mjpg-streamer。

下面是我使用的命令。

mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 800x448" -o "output_http.so -p 8090 -w /usr/local/share/mjpg-streamer/www/"

现在我想在 python 3 上执行它。所以我尝试使用 os.system() 和 subprocess.call() 来执行它,但它无法执行它并且在运行代码后网络摄像头出错了,所以我必须重新启动树莓派- pi 3. 当代码类似于os.system('python3 test.py') 时,即使os.system() 也能正常工作。

难道不能用pathon 3代码来执行mjpg-streamer吗?

下面是我的代码。

import os

os.system('mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 800x448" -o "output_http.so -p 8090 -w /usr/local/share/mjpg-streamer/www/"')

【问题讨论】:

【参考方案1】:

您也可以尝试使用允许保存 stdout 和 stderr 的子进程:

    import subprocess
    ### define the command
    command = 'mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 800x448" -o "output_http.so -p 8090 -w /usr/local/share/mjpg-streamer/www/"'
    ### execute the command and save stdout and stderr as variables
    output, error = subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

你将把标准输出保存在“输出”和“错误”变量中的“标准错误”中。

顺便说一句:建议使用listed format

【讨论】:

非常感谢!!有用!!请问你执行后如何停止它?我使用另一个变量来执行“killall mjpg_streamer”,但我认为有一些函数可以停止 subprocess.Popen.communicate()。 你可以取你正在执行的进程的ID,根据PID杀掉它,例如:proc = subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)取它并像以前一样执行:output,error = proc.communicate()然后停止进程基于 ID(您需要 import osimport signal):os.killpg(os.getpgid(proc.pid), signal.SIGTERM) 非常感谢!它真的帮了我很多

以上是关于为啥python3不能执行一些linux命令?的主要内容,如果未能解决你的问题,请参考以下文章

linux shell脚本为啥不能执行if命令

python执行linux系统命令的几种方法(python3经典编程案例)

python执行linux系统命令的几种方法(python3经典编程案例)

win10我安装了gcc编译器可以运行gcc命令,为啥不能使用g++命令呢?如图

为啥linux的MTR只能在root下运行

不知道为啥在linux命令行下输入一些命令怎么都显示没有找到?