Programing

하위 프로세스 표준 출력을 변수로 파이프

lottogame 2020. 9. 9. 18:56
반응형

하위 프로세스 표준 출력을 변수로 파이프 [중복]


이 질문에 이미 답변이 있습니다.

pythong하위 프로세스 모듈을 사용하여에서 명령을 실행 하고 출력을 변수에 저장하고 싶습니다 . 그러나 명령의 출력이 터미널에 인쇄되는 것을 원하지 않습니다. 이 코드의 경우 :

def storels():
   a = subprocess.Popen("ls",shell=True)
storels()

나는 디렉토리 목록을 터미널에 저장하는 대신 a. 나는 또한 시도했다 :

 def storels():
       subprocess.Popen("ls > tmp",shell=True)
       a = open("./tmp")
       [Rest of Code]
 storels()

이것은 또한 ls의 출력을 내 터미널에 인쇄합니다. ls > tmp터미널에서 실행 하면 터미널에 전혀 인쇄되지 않지만 .NET에 저장하기 때문에 다소 오래된 os.system 메서드로이 명령을 시도 ls했습니다 tmp. 그러나 같은 일이 발생합니다.

편집하다:

marcog의 조언을 따른 후 다음 오류가 발생하지만 더 복잡한 명령을 실행할 때만 발생합니다. cdrecord --help. 파이썬은 이것을 뱉어냅니다.

Traceback (most recent call last):
  File "./install.py", line 52, in <module>
    burntrack2("hi")
  File "./install.py", line 46, in burntrack2
    a = subprocess.Popen("cdrecord --help",stdout = subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

의 출력을 얻으려면 ls사용을 stdout=subprocess.PIPE.

>>> proc = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> output = proc.stdout.read()
>>> print output
bar
baz
foo

명령 cdrecord --help은 stderr로 출력되므로 대신 파이프해야합니다. 또한 아래에서 한 것처럼 명령을 토큰 목록으로 나눠야합니다. 그렇지 않으면 shell=True인수 를 전달하는 것이 좋습니다. 그러나 이렇게하면 완전히 날아간 셸이 발생하여 내용을 제어하지 않으면 위험 할 수 있습니다. 명령 문자열.

>>> proc = subprocess.Popen(['cdrecord', '--help'], stderr=subprocess.PIPE)
>>> output = proc.stderr.read()
>>> print output
Usage: wodim [options] track1...trackn
Options:
    -version    print version information and exit
    dev=target  SCSI target to use as CD/DVD-Recorder
    gracetime=# set the grace time before starting to write to #.
...

stdout과 stderr 모두로 출력하는 명령이 있고이를 병합하려는 경우 stderr을 stdout으로 파이핑 한 다음 stdout을 잡아서 수행 할 수 있습니다.

subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

에서 언급 한 바와 같이 크리스 모건 , 당신이 사용되어야한다 proc.communicate()대신 proc.read().

>>> proc = subprocess.Popen(['cdrecord', '--help'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> out, err = proc.communicate()
>>> print 'stdout:', out
stdout: 
>>> print 'stderr:', err
stderr:Usage: wodim [options] track1...trackn
Options:
    -version    print version information and exit
    dev=target  SCSI target to use as CD/DVD-Recorder
    gracetime=# set the grace time before starting to write to #.
...

If you are using python 2.7 or later, the easiest way to do this is to use the subprocess.check_output() command. Here is an example:

output = subprocess.check_output('ls')

To also redirect stderr you can use the following:

output = subprocess.check_output('ls', stderr=subprocess.STDOUT)



In the case that you want to pass parameters to the command, you can either use a list or use invoke a shell and use a single string.

output = subprocess.check_output(['ls', '-a'])
output = subprocess.check_output('ls -a', shell=True)

With a = subprocess.Popen("cdrecord --help",stdout = subprocess.PIPE) , you need to either use a list or use shell=True;

Either of these will work. The former is preferable.

a = subprocess.Popen(['cdrecord', '--help'], stdout=subprocess.PIPE)

a = subprocess.Popen('cdrecord --help', shell=True, stdout=subprocess.PIPE)

Also, instead of using Popen.stdout.read/Popen.stderr.read, you should use .communicate() (refer to the subprocess documentation for why).

proc = subprocess.Popen(['cdrecord', '--help'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()

참고URL : https://stackoverflow.com/questions/4514751/pipe-subprocess-standard-output-to-a-variable

반응형