我在覆盆子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);
答案 0 :(得分:1)
最后找到了解决这个问题的方法。问题是Plex Media Scanner程序正在写入4kb缓冲区并且subprocess.PIPE没有捕获它。
我添加了
stdbuf -oL -eL
要运行的命令,发出新命令
cmd = ['stdbuf', '-oL', '-eL', '/usr/lib/plexmediaserver/Plex Media Scanner', '--list']
这就是诀窍。另见:
https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe