来自命令的管道在不同的用户下运行Popen python3

时间:2017-09-01 14:55:45

标签: python subprocess

我在覆盆子pi上运行Plex服务器,我遇到了更新库的问题所以我正在编写一个python类,可以调用它来更新所有或特定的库。

我想尽量使用它,即使用库名而不是库号,但我遇到了一些问题。必须在我当前设置的Plex用户帐户下运行“Plex Media Scanner”命令。我可以使用下面的代码运行命令(在sudo下运行),但我无法捕获命令的输出,即,当代码的Popen部分运行时,库的列表打印到终端,但是, check_output命令什么都不返回。我已经尝试将stdout和stderr连接到subprocess.PIPE,但那些也没有捕获任何东西。

运行下面的代码给出了以下输出

 15: Fitness
 10: Movies
  8: Music
  2: TV Shows
b''

前四行是Popen的输出,最后一行是check_output的输出。我已经使用简单的['ls',' - l']命令测试了所有其他设置相同,check_output可以捕获输出。这告诉我它必须只是Plex命令。有没有人在捕获命令输出方面有类似的问题,如果有,你是如何解决它的?

#!/usr/bin/env python3
import subprocess as subp;
import pwd, os;

class plex_scan():
    def __init__(self):
        self.pw_record = pwd.getpwnam( 'plex' );
        self.env = os.environ.copy()
        self.env['HOME'           ] = self.pw_record.pw_dir
        self.env['PWD'            ] = self.pw_record.pw_dir
        self.env['LOGNAME'        ] = self.pw_record.pw_name
        self.env['USER'           ] = self.pw_record.pw_name
        self.env['PYTHONHOME'     ] = "/usr/lib/plexmediaserver/Resources/Python";
        self.env['LD_LIBRARY_PATH'] = "${LD_LIBRARY_PATH}:/usr/lib/plexmediaserver";

        cmd = ['/usr/lib/plexmediaserver/Plex Media Scanner', '--list']
        self.proc = subp.Popen(cmd, env=self.env); 
        self.proc.wait();
        out = subp.check_output(cmd, env=self.env); 
        print( out );
if __name__ == "__main__":
  x = plex_scan( );   
  exit(0);

1 个答案:

答案 0 :(得分:1)

最后找到了解决这个问题的方法。问题是Plex Media Scanner程序正在写入4kb缓冲区并且subprocess.PIPE没有捕获它。

我添加了

stdbuf -oL -eL 

要运行的命令,发出新命令

cmd = ['stdbuf', '-oL', '-eL', '/usr/lib/plexmediaserver/Plex Media Scanner', '--list']

这就是诀窍。另见:

https://www.reddit.com/r/learnpython/comments/1dmhsz/subprocesspopen_stdout_flush_the_buffer/#bottom-comments

https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe