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

2024-04-25 07:34:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个raspberry pi上运行一个Plex服务器,在更新库时遇到了问题,所以我编写了一个python类,可以调用它来更新所有或特定的库。你知道吗

我想让它尽可能通用,即使用库名而不是库号,但我遇到了一些问题。“Plex Media Scanner”命令必须在我当前设置的Plex用户帐户下运行。我可以使用下面的代码(在sudo下运行)获取要运行的命令,但是我无法捕获命令的输出,即,当代码的Popen部分运行时,会向终端打印库的列表,但是check\u output命令不会返回任何内容。我试过用管道把stdout和stderr连接起来子流程管道,但它们也不能捕捉到任何东西。你知道吗

运行下面的代码可以得到以下输出

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

前四行是Popen的输出,最后一行是check\u的输出。我已经测试过使用一个简单的['ls','-l']命令与所有其他设置相同,并检查输出是否可以捕获输出。这告诉我它一定是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);

Tags: 代码name命令selfenvlibusrcheck
1条回答
网友
1楼 · 发布于 2024-04-25 07:34:55

终于想出了解决这个问题的办法。问题是Plex媒体扫描程序正在写入4kb缓冲区和子流程管道我没有抓住它。你知道吗

我补充道

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

相关问题 更多 >

    热门问题