하위 프로세스 표준 출력을 변수로 파이프 [중복]
이 질문에 이미 답변이 있습니다.
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
'Programing' 카테고리의 다른 글
querySelectorAll을 사용하여 직계 자식 검색 (0) | 2020.09.09 |
---|---|
Vim에서 인코딩 및 파일 인코딩을 utf-8로 설정 (0) | 2020.09.09 |
iOS 이미지 방향에 이상한 동작이 있습니다. (0) | 2020.09.09 |
AngularJS에서 동적 모델 이름을 어떻게 설정할 수 있습니까? (0) | 2020.09.09 |
Python / numpy / pandas에서 임의의 객체가 NaN인지 효율적으로 확인합니까? (0) | 2020.09.09 |