web-dev-qa-db-ja.com

Pythonサブプロセスreadlines()?

ユーザーガイドで推奨されているように、os.popenからsubprocess.popenに移動しようとしています。私が抱えている唯一の問題は、readlines()を機能させる方法が見つからないように見えることです。

昔はできるようになりました

list = os.popen('ls -l').readlines()

でもできません

list = subprocess.Popen(['ls','-l']).readlines()
15
joedborg

_subprocess.Popen_では、communicateを使用してデータを読み書きします。

_out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate() 
_

次に、プロセスのstdoutからの文字列をsplitlines()でいつでも分割できます。

_out = out.splitlines()
_
26
agf
ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()

または、行ごとに読みたい場合(おそらく、他のプロセスはlsよりも集中的です):

for ln in ls.stdout:
    # whatever
32
Fred Foo

stdout出力を文字列として返すシステムコールを作成する

lines = subprocess.check_output(['ls', '-l']).splitlines()
11
jfs

サブプロセスを使用するより詳細な方法。

        # Set the command
        command = "ls -l"

        # Setup the module object
        proc = subprocess.Popen(command,
                            Shell=True,   
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

        # Communicate the command   
        stdout_value,stderr_value = proc.communicate()

        # Once you have a valid response, split the return output    
        if stdout_value:
            stdout_value = stdout_value.split()
3
_list = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0].splitlines()
_

help(subprocess)から直接

3
Kimvais