Python 외부 명령 실행 subprocess 사용 상세 정보
9507 단어 Python실행외부 명령subprocess
1. subprocess 이해
1、subprocess.run() 메서드
subprocess.run () 방법은 정부에서 추천하는 방법으로 거의 모든 일을 그것으로 완성할 수 있다.
함수 소스는 다음과 같습니다.
subprocess.run(args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
ced=None,
timeout=None,
check=False,
enccoding=None,
error=None)
이 함수는 CompletedProcess 클래스(속성 전입 매개 변수와 반환 값이 있음)의 실례를 되돌려줍니다. 이 함수의 매개 변수는 매우 많기 때문에 자주 사용하는 것만 기억하면 됩니다.1,args: 운영체제에서 실행해야 하는 명령을 대표합니다. 문자열 형식(shell=True 요구)이거나list 목록 형식일 수 있습니다.
2,*: 일반적으로 목록 또는 사전 유형의 가변 매개변수를 나타냅니다.
3. stdin, stdout, stderr: 실행 가능한 프로그램의 표준 입력, 표준 출력, 표준 오류 파일 핸들을 지정합니다
4, 셸: 프로그램이 셸에서 실행되어야 하는지를 나타낸다. 셸의 특성을 사용하려면 셸=True를 설정한다. 그러면 셸 명령의 파이프, 파일 이름 어댑터, 환경 변수 등을 사용할 수 있지만python은 셸과 유사한 모듈을 많이 제공한다. 예를 들어glob,fnmatch,os.walk()、os.path.expandvars()、os.path.expanduser () 와 shutil.
5, check: check가 True로 설정되면 명령의 반환 값을 검사하고 반환 값이 0이면 AclledProcessError의 이상이 발생합니다.
6,timeout: 시간 초과 시간을 설정하고, 시간 초과하면kill 하위 프로세스
1. 셸 명령을 문자열로 실행
[root@localhost python]# vim 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("ls -l /ltp | head -2", shell=True) # run , b
# total 184980
# -rw-r--r--. 1 root root 10865 May 8 16:21 123.txt
print(b) # run CompletedProcess
# CompletedProcess(args='ls -l /ltp | head -2', returncode=0)
print(b.args) # CompletedProcess agrs , shell
# ls -l /ltp | head -2
print(b.returncode) #
# 0
결과 전시[root@localhost python]# ./1.py
total 184980
-rw-r--r--. 1 root root 10865 May 8 16:21 123.txt
CompletedProcess(args='ls -l/ltp | head -2', returncode=0)2
ls -l/ltp | head -2
0
2. 목록을 사용하여 실행
, ,
#!/bin/env python3
import subprocess
b = subprocess.run(["ls", "-l", "/ltp"])
print(b)
print(b.args)
print(b.returncode)
실행 결과[root@localhost python]# ./2.py
total 10865
-rw-r--r--. 1 root root 10865 May 8 16:21 123.txt
CompletedProcess(args=['ls', '-l', '/ltp'], returncode=0)
['ls', '-l', '/ltp']
0
3. 스크립트 출력 캡처
[root@localhost python]# cat 3.py
#!/bin/env python3
import subprocess
# stdout=subprocess.PIPE
b=subprocess.run("ls -l /ltp | head -2", shell=True, stdout=subprocess.PIPE)
print(b.stdout)
결과 표시[root@localhost python]# ./1.py
b'total 184980-rw-r--r--. 1 root root 10865 May 8 16:21 123.txt'
4. 이상 감지
예제 1: 아날로그 renturncode 값이 0이 아닙니다.
전송 매개 변수 check=True, 반환 값이 0이 아닌 경우 예외가 발생합니다.
[root@localhost python]# cat 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
print(b.returncode)
실행 결과: CalledProcessError 유형 오류가 반환되었습니다.
[root@localhost python]# ./1.py
ls: cannot access /123: No such file or directory
Traceback (most recent call last):
File "./1.py", line 3, in <module>
b=subprocess.run("ls -l /123 | head -2 && exit 1", shell=True, stdout=subprocess.PIPE, check=True)
File "/usr/local/python3/lib/python3.7/subprocess.py", line 487, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'ls -l /123 | head -2 && exit 1' returned non-zero exit status 1.
# CalledProcessError
예 2: 시뮬레이션 실행 시간 초과TimeoutExpired 예외로 돌아가기
[root@localhost python]# vim 1.py
#!/bin/env python3
import subprocess
b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
print(b.returncode)
결과 표시[root@localhost python]# ./1.py
Traceback (most recent call last):
File "/usr/local/python3/lib/python3.7/subprocess.py", line 474, in run
stdout, stderr = process.communicate(input, timeout=timeout)
File "/usr/local/python3/lib/python3.7/subprocess.py", line 939, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/local/python3/lib/python3.7/subprocess.py", line 1682, in _communicate
self._check_timeout(endtime, orig_timeout)
File "/usr/local/python3/lib/python3.7/subprocess.py", line 982, in _check_timeout
raise TimeoutExpired(self.args, orig_timeout)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./1.py", line 3, in
b=subprocess.run("while 2>1;do sleep 1;done",timeout=3, shell=True, stdout=subprocess.PIPE, check=True)
File "/usr/local/python3/lib/python3.7/subprocess.py", line 479, in run
stderr=stderr)
subprocess.TimeoutExpired: Command 'while 2>1;do sleep 1;done' timed out after 3 seconds
2, Popen 클래스
1. Popen 클래스 초보 인식
일단 Popen 클래스의 구조 함수를 보겠습니다.
class Popen(
args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
preexec_fn=None,
close_fds=False,
shell=False,
cwd=None,
env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0
):
매개 변수문자열 또는 목록 bufsize0: 버퍼 없음
매개 변수
문자열 또는 목록
bufsize
0: 버퍼 없음
1: 행 버퍼
추가 양수값: 버퍼 크기
마이너스 값: 기본 시스템 버퍼를 사용합니다 (일반적으로 전체 버퍼)
executable
일반적으로 사용하지 않습니다.args 문자열이나 목록의 첫 번째 항목은 프로그램 이름을 표시합니다
stdin
stdout
stderr
None: 상위 상속 프로세스에 대한 리디렉션이 없습니다.
PIPE:파이프 생성
파일 객체
파일 설명자(정수)
stderr도 stdout로 설정할 수 있습니다.
preexec_fn
갈고리 함수,fork와exec 사이에서 실행
close_fds
유닉스에서 새 프로세스를 실행하기 전에 0/1/2 이외의 파일을 닫을지 여부
윈도우즈에서 부모 프로세스를 계승하지 않거나 계승하는 파일 설명
shell
True라면:
유닉스에서 args 앞에 "/bin/bash""-c"를 추가한 것과 같다
윈도우즈에서 "cmd.exe/c"를 추가한 것과 같다
cwd
작업 디렉토리 설정
env
환경 변수 설정
unviersal_newlines
여러 줄 바꿈 문자가 ""로 통합됩니다.
startupinfo
윈도우즈에서 CreateProcess에 전달되는 구조체
creationflags
윈도우즈에서 CREATE_ 전달NEW_CONSOLE 자체 콘솔 창 만들기
2. Popen 사용법
1、subprocess.Popen([“cat”, “abc.txt”])
2、subprocess.Popen(“cat abc.txt”, shell=True)
위의 두 번째는 사실:subprocess에 해당한다.Popen(["/bin/bash", “-c”, “cat abc.txt”])
예:
[root@localhost python]# cat 3.py
#!/bin/env python3
import subprocess
obj = subprocess.Popen("ls -l /ltp",
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
error_info = obj.stderr.read()
out_info = obj.stdout.read()
result = out_info + error_info
print(result)
[root@localhost python]# ./3.py
total 184980
-rw-r--r--. 1 root root 10865 May 8 16:21 123.txt
-rw-r--r--. 1 root root 802 Apr 21 09:42 ab.sh
drwxr-xr-x. 3 root root 101 Apr 1 18:34 auth
-rw-r--r--. 1 root root 5242880 Mar 18 13:20 bigfile
-rwxrwxrwx. 1 root root 1392 Feb 5 09:24 dingding.sh
Popen 클래스 객체 방법이름
기능
poll()
종료 여부 확인, 반환값 설정
wait()
종료 대기, 반환값 설정
communicate()
매개 변수는 표준 입력입니다. 표준 출력과 표준 오류를 되돌려줍니다.
send_signal()
발동 신호 (주로 linux에서 유용함)
terminate()
프로세스를 종료하고 유닉스에 대응하는 SIGTERM 신호, 윈도우즈에서api 함수TerminateProcess() 호출
kill()
프로세스 죽이기(unix 대응 SIGKILL 신호), 윈도우즈 아래 동일
stdin
stdout
stderr
매개변수에서 PIPE를 지정할 때 유용
pid
프로세스 id
returncode
프로세스 반환값
추가 방법
1、subeprocess.call(*args, *kwargs):call() 방법으로 Popen () 실행 프로그램을 호출하고 실행이 완료될 때까지 기다립니다
2、subpeocess.check_call (*args, *kwargs): 위의call () 을 호출합니다. 반환 값이 0이 아니면 이상 반환합니다.
3、subprocess.check_output(*args, *kwargs): Popen () 실행 프로그램을 호출하고 표준 출력으로 되돌려줍니다.
2. os모듈을 보충하여 외부 명령을 실행한다
1、os.시스템 () 방법
예:
[root@localhost python]# cat 4.py
#!/bin/env python3
import os
# ret
ret = os.system('ls -l /ltp |head -2')
print("
" if ret == 0 else "
")
실행 결과[root@localhost python]# ./4.py
total 184980
-rw-r--r--. 1 root root 10865 May 8 16:21 123.txt
실행 성공
2、os.popen () 사용법
subprocess.Popen()과 유사하여 쓰지 않겠습니다.
보충:subprocess.run () 및subprocess.Popen () 의 실행 결과는 캐시에 기록되어 있으며, 실행이 끝난 후에 결과를 출력할 수 있으며, 실시간으로 터미널에서 출력되지 않습니다.그리고 os.시스템 () 은 터미널 인터페이스에 실시간으로 출력됩니다.
이상은Python이 외부 명령을 실행하는subprocess의 상세한 내용입니다. 더 많은 Python이 외부 명령을 실행하는 것에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.