>  기사  >  백엔드 개발  >  Python에서 Linux 셸 명령 호출

Python에서 Linux 셸 명령 호출

高洛峰
高洛峰원래의
2016-11-23 13:04:141421검색

파일 시스템 마운트와 같은 비교적 간단한 작업을 완료하기 위해 셸 명령을 직접 호출해야 하는 경우가 있습니다. 그렇다면 Python을 사용하여 Linux Shell 명령을 어떻게 호출합니까? 일반적으로 사용되는 메소드는 다음과 같습니다.

1. os 모듈

1.1. os 모듈의 exec 메소드 계열

Python의 exec 시스템 메소드는 일관됩니다. Unix exec 시스템 호출을 사용합니다. 외부 프로그램이 현재 프로세스의 코드를 대체하고 반환하지 않기 때문에 이러한 메서드는 하위 프로세스에서 외부 프로그램을 호출하는 데 적합합니다. (help(os) --> "exec"를 검색해 보았으나 어떻게 사용하는지 잘 모르겠습니다.)

1.2. 🎜 >

시스템 메소드는 외부 프로그램을 실행하기 위한 하위 프로세스를 생성하며, 외부 프로그램의 실행 결과만 반환합니다. 이 방법은 외부 프로그램이 결과를 출력하지 않는 상황에 더 적합합니다.

[python] view plaincopy

>>> import os

>>> os.system("echo "Hello World"") # os.system을 사용하여 직접 echo 명령 호출

Hello World ——————> 명령 결과 인쇄

0 ——————>

>>> val = os.system("ls -al | grep "log" ") # 반환 값을 받으려면 val을 사용하세요.

-rw-r--r -- 1 root 6030829 Dec 31 15:14 log ——————> 이때는 명령 결과만 출력됩니다

>>> print val  

0 ——> 이때 명령이 정상적으로 실행되면 반환 값은 0입니다.

>>> val = os.system("ls -al | grep "log1" ")

>>> print val

256 ——————> 결과를 반환하지 않는 명령을 호출하려면 os.system을 사용하고 반환 값은 256입니다. ~

> >>  

참고: 위에서 언급한 것처럼 이 방법은 os.system의 결과인 외부 프로그램의 결과를 저장합니다. 명령어의 반환 값을 받고 싶다면 아래를 보세요~

1.3.os 모듈의 popen 메소드

이 메소드는 필요할 때 매우 유용합니다. 외부 프로그램의 출력 결과를 얻으려면 파일과 같은 객체를 반환하고 객체를 호출합니다. read() 또는 readlines() 메서드는 출력 내용을 읽을 수 있습니다. 예를 들어 urllib를 사용하여 Web API를 호출하는 경우 가져온 데이터를 처리해야 합니다. os.popen(cmd) 명령의 출력을 얻으려면 a=os.popen(cmd).read()

와 같이 read() 또는 readlines()를 호출하면 됩니다. [python] 일반 복사 보기

>>> os.popen('ls -lt')                                                        > >>> print os.popen('ls -lt').read() # read() 메소드 호출 명령의 결과를 얻을 수 있습니다

총 6064

-rwxr-xr-x 길이 1개 1월 5일 23일 21:00 hello.sh

-rw-r--r -- 길이 1개 147 1월 5일 20:26 Makefile

drwxr-xr-x 3 긴 긴 4096 1월 2일 19:37 테스트

-rw-r--r-- 1 루트 루트 6030829 12월 31일 15:14 로그

drwxr -xr-x 2 long 4096 12월 28일 09:36 pip_build_long

drwx------ 2 Debian-gdm Debian-gdm 4096 12월 23일 19:08 pulse-gylJ5EL24GU9

drwx - ----- 2 long long 4096 1970년 1월 1일 궤도 길이

>>> val = os.popen('ls -lt').read() # 명령을 수신하려면 변수를 사용하십시오. 값

>>> 값에 "log"가 있는 경우:                                                                   ~                                                 로그가 있습니다."

... else:

... print "No,not happy"

...

하하, 로그가 있습니다



2. 명령 모듈


은 명령 모듈의 getoutput 메소드를 사용합니다. 이 메소드는 popen과의 차이점은 popen이 파일과 같은 객체를 반환하는 반면, 이 메소드는 외부 프로그램의 출력을 문자열로 반환한다는 것입니다. 많은 경우에 사용하기가 더 편리합니다.

주요 메서드:


* Commands.getstatusoutput(cmd) 반환(상태, 출력)

* Commands.getoutput(cmd) 출력 결과만 반환

* Commands.getstatus(file) 반환 ls -ld 파일의 실행 결과 문자열이 getoutput을 호출합니다. 이 방법은 사용하지 않는 것이 좋습니다.


[python] view plaincopy

long@zhouyl:/tmp/tests$ python

Python 2.7.3(기본값, 2013년 1월 2일, 16:53:07)

[GCC 4.7.2] on linux2

"help", "를 입력하세요. 자세한 내용은 copyright", "크레딧" 또는 "라이센스"를 참조하세요.

>>> 명령 가져오기

>>> Commands.getstatusoutput('ls -lt') # 반환(상태, 출력)

(0, 'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan 5 21:34 Makefilen-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log')

>>> Commands.getoutput('ls -lt') # Return 명령어 출력결과(Shell 명령어 출력형식과 다른 것 같네요~)

'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw -r--r- - 긴 길이 1개 147 Jan 5 21:34 Makefilen-rw-r--r-- 긴 길이 1개 6030829 Jan 5 21:34 log'

>>> .getstatus('log' )                   # 'log' 파일에서 동일한 작업을 수행하려면 Commands.getoutput에서 명령을 호출합니다.

'-rw-r--r-- 1 long long 6030829 Jan 5 21: 34 log'

>>>



3. 공식에 따르면 Python 문서에서 subprocess 모듈은 위의 모듈을 대체하는 데 사용됩니다. Python에는 mssh라는 병렬 SSH 도구가 구현되어 있습니다. 코드는 매우 짧지만 작업을 수행하기 위해 스레드에서 하위 프로세스를 호출합니다.

[python] 하위 프로세스 가져오기 호출에서 일반 복사 보기


>>

>>> call(["ls", "-l"])


시스템에 비해 하위 프로세스의 장점은 더 유연하다는 것입니다(표준 출력을 얻을 수 있음). , 표준 오류, "실제" 상태 코드, 향상된 오류 처리 등...). 내 생각에 os.system을 사용하는 것은 더 이상 쓸모가 없거나 곧 그렇게 될 것입니다.

4. 다양한 방법의 비교 및 ​​요약

4.1 os.system 정보

os.system("some_command with args")이 명령을 내립니다. 시스템 셸에 인수를 전달할 뿐만 아니라 이 방법으로 여러 명령을 동시에 실행할 수 있고 파이프와 입력 및 출력 리디렉션을 설정할 수 있기 때문에 이는 매우 좋습니다. 예:
os.system("some_command < input_file | another_command > output_file")
그러나 이것이 편리하기는 하지만 공백 등의 셸 문자 이스케이프를 수동으로 처리해야 합니다. 또한 이를 통해 외부 프로그램이 아닌 간단한 쉘 명령만 실행할 수 있습니다.

4.2. os.popen 정보

stream = os.popen("some_command with args")를 사용하면 os.system과 동일한 작업을 수행할 수도 있습니다. .system과의 차이점은 os.popen이 표준 입력 및 출력에 액세스하는 데 사용할 수 있는 파일과 같은 객체를 반환한다는 것입니다.

4.3.subprocess.popen 정보

subprocess 모듈의 Popen 클래스는 os.popen을 대체하기 위한 것이지만 매우 포괄적이기 때문에 약간 더 많습니다. os.popen보다 복잡합니다.
예를 들어 print os.popen("echo Hello World").read() 대신 print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()를 사용할 수 있습니다. 하지만 이에 비해 4가지 다른 popen 함수를 포함하는 통일된 클래스를 사용하는 것이 좋습니다.

4.4.subprocess.call 소개

subprocess 모듈의 호출 기능. 이는 기본적으로 Popen 클래스와 같으며 동일한 매개변수를 사용하지만 단순히 명령이 완료될 때까지 기다리고 반환 코드를 제공합니다. 예를 들면 다음과 같습니다.
return_code = subprocess.call("echo Hello World", shell=True)


os 모듈에도 C와 마찬가지로 fork/exec/spawn 기능이 있지만 저는 그렇지 않습니다. 직접 사용하지 마십시오. 하위 프로세스가 더 적합할 수 있습니다.


======================================= === ==
[1] http://demi-panda.com/2013/01/25/python-shell-command/index.html
[2] http://m.blog. csdn.net /blog/overstack/9295995
[3] http://blog.csdn.net/swiftshow/article/details/7755543

다음은 관련 콘텐츠에 대한 공식 Python 문서입니다. 기사:

[4] http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module - 하위 프로세스를 사용하여 이전 방법을 대체하는 방법에 대해

[5] http://docs.python.org/lib/os-process.html -- os의 exec 메소드 계열 및 시스템 메소드

[6] http://docs. python.org/ lib/os-newstreams.html -- os popen 메소드

[7] http://docs.python.org/lib/node528.html -- os 하위 프로세스 소개


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.