Python'da harici bir komut ├ža─č─▒rmak


Al─▒nan cevaba git


Bir Python beti─činden harici bir komutu (Unix kabu─čuna veya Windows komut istemine yazm─▒┼č─▒m gibi) nas─▒l ├ža─č─▒r─▒rs─▒n─▒z?


4491









Cevap say─▒s─▒n─▒ say: 30






Standart k├╝t├╝phanedeki alt i┼člem mod├╝l├╝ne bak─▒n :

 import subprocess
subprocess.run(["ls", "-l"])
 

Avantaj─▒ subprocess vs. system onu (alabilirsiniz daha esnek olmas─▒d─▒r stdout , stderr "ger├žek" durum kodu, daha iyi hata i┼čleme, vs ...).

Resmi belgeler ├Ânerir subprocess alternatif ├╝zerinde mod├╝l├╝ os.system() :

subprocess Mod├╝l yeni s├╝re├žler yumurtlama ve onlar─▒n sonu├žlar─▒n─▒ almak i├žin, daha g├╝├žl├╝ olanaklar sa─člar; Bu mod├╝l├╝ kullanmak bu i┼člevi kullanmak i├žin tercih edilir [ os.system() ].

Alti┼člem Mod├╝l├╝ ile de─či┼čtirilmesi Ya┼čl─▒ Fonksiyonlar b├Âl├╝m├╝nde subprocess belgelerinde baz─▒ yararl─▒ tarifi olabilir.

3.5'ten ├Ânceki Python s├╝r├╝mleri i├žin call ┼čunlar─▒ kullan─▒n :

 import subprocess
subprocess.call(["ls", "-l"])
 

4320







─░┼čte harici programlar─▒ ├ža─č─▒rman─▒n yollar─▒n─▒ ve her birinin avantaj ve dezavantajlar─▒n─▒ ├Âzetleyen:

  1. os.system("some_command with args") komutu ve arg├╝manlar─▒ sisteminizin kabu─čuna iletir. Bu ├žok ho┼č, ├ž├╝nk├╝ asl─▒nda bir kerede birden fazla komut ├žal─▒┼čt─▒rabilir, boru ve giri┼č / ├ž─▒k─▒┼č y├Ânlendirmesini ayarlayabilirsiniz. ├ľrne─čin:

     os.system("some_command < input_file | another_command > output_file")  
     

Bununla birlikte, bu elveri┼čli olsa da, bo┼čluklar vb. Gibi kabuk karakterlerinden ka├ž─▒┼č─▒n─▒z─▒ manuel olarak ele alman─▒z gerekir. ├ľte yandan, bu ayn─▒ zamanda sadece harici komutlar yerine sadece kabuk komutlar─▒ olan komutlar─▒ ├žal─▒┼čt─▒rman─▒za izin verir. Belgelere bak─▒n─▒z .

  1. stream = os.popen("some_command with args") os.system Bu i┼člem i├žin standart giri┼č / ├ž─▒k─▒┼ča eri┼čmek i├žin kullanabilece─činiz dosya benzeri bir nesne vermesi d─▒┼č─▒nda ayn─▒ ┼čeyi yapaca─č─▒z . Hepsi G / ├ç'yi biraz farkl─▒ ┼čekilde ele alan 3 popen varyant─▒ daha vard─▒r. Her ┼čeyi bir dize olarak iletirseniz, komutunuz kabu─ča iletilir; e─čer onlar─▒ bir liste halinde ge├žirirseniz, hi├žbir ┼čeyden ka├žmak i├žin endi┼čelenmenize gerek kalmaz. Belgelere bak─▒n─▒z .

  2. Popen S─▒n─▒f subprocess mod├╝l├╝. Bunun yerine ge├žmesi ama├žlanm─▒┼čt─▒r os.popen ancak bu kadar kapsaml─▒ olmalar─▒ nedeniyle biraz daha karma┼č─▒k olmalar─▒n─▒n dezavantaj─▒ vard─▒r. ├ľrne─čin, ┼č├Âyle diyeceksiniz:

     print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
     

    yerine:

     print os.popen("echo Hello World").read()
     

    ancak, t├╝m se├ženeklerin 4 farkl─▒ popen i┼člevi yerine bir birle┼čtirilmi┼č s─▒n─▒fta olmas─▒ g├╝zel. Belgelere bak─▒n─▒z .

  3. call ─░┼člev subprocess mod├╝l├╝. Bu temelde Popen s─▒n─▒f gibidir ve ayn─▒ arg├╝manlar─▒n hepsini al─▒r, ancak komut tamamlanana ve size d├Ân├╝┼č kodunu verene kadar bekler. ├ľrne─čin:

     return_code = subprocess.call("echo Hello World", shell=True)  
     

    Belgelere bak─▒n─▒z .

  4. Python 3.5 veya daha yenisindeyseniz subprocess.run , yukar─▒daki gibi olan ancak daha esnek olan yeni i┼člevi kullanabilirsiniz CompletedProcess , komut ├žal─▒┼čt─▒rmay─▒ tamamlad─▒─č─▒nda bir nesneyi d├Ând├╝r├╝r .

  5. Os mod├╝l├╝ ayn─▒ zamanda bir C program─▒nda sahip olabilece─činiz t├╝m ├žatal / exec / spawn i┼člevlerine de sahiptir, ancak bunlar─▒ do─črudan kullanman─▒z─▒ ├Ânermiyorum.

subprocess Mod├╝l muhtemelen Kulland─▒─č─▒n─▒z olmal─▒d─▒r.

Son olarak, kabu─čun bir dizge olarak ├žal─▒┼čt─▒r─▒laca─č─▒ son komutu ge├žti─činiz t├╝m y├Ântemlerde ve onu ka├žmaktan sorumlu oldu─čunuzu l├╝tfen unutmay─▒n. ─░letti─činiz dizenin herhangi bir k─▒sm─▒na tam olarak g├╝venilemedi─či takdirde ciddi g├╝venlik etkileri vard─▒r . ├ľrne─čin, bir kullan─▒c─▒ dizenin bir k─▒sm─▒n─▒ / herhangi bir k─▒sm─▒n─▒ giriyorsa. Emin de─čilseniz, bu metodlar─▒ sadece sabitler ile kullan─▒n. Size bir ipucu vermek i├žin bu kodu g├Âz ├Ân├╝nde bulundurun:

 print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()
 

ve kullan─▒c─▒n─▒n t├╝m dosya sistemini silebilecek "annem beni sevmedi & & rm -rf /" bir ┼čey girdi─čini hayal edin.


2854







Tipik uygulama:

 import subprocess

p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()
 

Borudaki stdout verilerle istedi─činiz ┼čeyi yapmakta ├Âzg├╝rs├╝n├╝z . Asl─▒nda, sadece bu parametreleri ( stdout= ve stderr= ) ihmal edebilirsiniz ve b├Âyle davran─▒r os.system() .


319







├çocuk s├╝recini ├ža─č─▒ran i┼člemden ay─▒rma konusunda baz─▒ ipu├žlar─▒ (├žocuk i┼člemine arka planda ba┼člama).

Bir CGI beti─činden uzun bir g├Ârev ba┼člatmak istedi─činizi varsayal─▒m; bu, alt i┼člemin CGI beti─či y├╝r├╝tme i┼čleminden daha uzun ya┼čamas─▒ gerekti─čidir.

Alt i┼člem mod├╝l├╝ dok├╝manlar─▒ndan klasik ├Ârnek:

 import subprocess
import sys

# some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # call subprocess

# some more code here
 

Buradaki fikir, longtask.py i┼člemi tamamlanana kadar 'subprocess ├ža─čr─▒s─▒' sat─▒r─▒nda beklemek istemeyece─činizdir. Ancak ├Ârnekten 'burada biraz daha kod' sat─▒r─▒ndan sonra ne oldu─ču a├ž─▒k de─čildir.

Hedef platformum freebsd idi, ancak geli┼čtirme pencerelerde yap─▒ld─▒, bu y├╝zden ilk ├Ânce pencerelerde sorunla kar┼č─▒la┼čt─▒m.

Pencerelerde (win xp), longtask.py ├žal─▒┼čmas─▒n─▒ bitirinceye kadar ana i┼člem bitmez. CGI-beti─činde istedi─čin bu de─čil. Sorun Python'a ├Âzg├╝ de─čil, PHP toplulu─čunda da sorunlar ayn─▒.

├ç├Âz├╝m, DETACHED_PROCESS ─░┼člem Olu┼čturma Bayra─č─▒n─▒ win API's─▒ndaki temel CreateProcess i┼člevine iletmektir. Pywin32'yi kurduysan─▒z, bayra─č─▒ win32process mod├╝l├╝nden i├že aktarabilirsiniz, aksi halde kendiniz tan─▒mlaman─▒z gerekir:

 DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],
                       creationflags=DETACHED_PROCESS).pid
 

/ * UPD 2015.10.27 @eryksun, a┼ča─č─▒daki a├ž─▒klamada, anlamsal olarak do─čru bayra─č─▒n CREATE_NEW_CONSOLE (0x00000010) * / oldu─čunu not eder.

Freebsd'de ba┼čka bir sorunumuz var: ebeveyn i┼člemi bitti─činde, ├žocuk i┼člemlerini de bitirir. Ve bu da CGI-script'de istedi─čin ┼čey de─čil. Baz─▒ deneyler, sorunun sys.stdout payla┼č─▒m─▒nda g├Âr├╝nd├╝─č├╝n├╝ g├Âstermi┼čtir. Ve ├žal─▒┼čma ├ž├Âz├╝m├╝ ┼čuydu:

 pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
 

Kodu di─čer platformlarda kontrol etmedim ve freebsd'deki davran─▒┼č─▒n nedenlerini bilmiyorum. E─čer biri biliyorsa, l├╝tfen fikirlerinizi payla┼č─▒n. Python'da arkaplan i┼člemlerinin ba┼člat─▒lmas─▒ ├╝zerine googling hen├╝z bir ─▒┼č─▒k tutmuyor.


204







Os.system yerine subprocess mod├╝l├╝n├╝ kullanman─▒z─▒ ├Âneririm, ├ž├╝nk├╝ sizin i├žin ka├žmay─▒ engeller ve bu nedenle ├žok daha g├╝venlidir: http://docs.python.org/library/subprocess.html

 subprocess.call(['ping', 'localhost'])
 

127







 import os
cmd = 'ls -al'
os.system(cmd)
 

Komutun sonu├žlar─▒n─▒ d├Ând├╝rmek istiyorsan─▒z, kullanabilirsiniz os.popen . Bununla birlikte, bu, 2.6'dan bu yana, di─čer cevaplar─▒n iyi ele ald─▒─č─▒ alt s├╝re├ž mod├╝l├╝n├╝n lehine kald─▒r─▒lm─▒┼čt─▒r .


126







 import os
os.system("your command")
 

Komutun temizlenmedi─činden tehlikeli oldu─čunu unutmay─▒n. 'Os' ve 'sys' mod├╝lleriyle ilgili dok├╝mantasyon i├žin Google'─▒ size b─▒rak─▒yorum. Benzer ┼čeyler yapacak bir├žok i┼člev (exec * ve spawn *) vard─▒r.


122







Python ile harici komutlar─▒ ├ža─č─▒rman─▒za izin veren bir├žok kitapl─▒k vard─▒r. Her k├╝t├╝phane i├žin bir tan─▒m verdim ve harici bir komut ├ža─č─▒rman─▒n bir ├Ârne─čini g├Âsterdim. ├ľrnek olarak kulland─▒─č─▒m komut ┼čudur ls -l (t├╝m dosyalar─▒ listele). E─čer listeledi─čim k├╝t├╝phanelerden herhangi biri hakk─▒nda daha fazla bilgi edinmek istiyorsan─▒z, her birinin belgelerini ba─člad─▒m.

Kaynaklar:

Bunlar─▒n hepsi k├╝t├╝phaneler:

Umar─▒m bu, hangi k├╝t├╝phaneyi kullanaca─č─▒n─▒za karar vermenize yard─▒mc─▒ olacakt─▒r :)

alti┼člem

Alt i┼člem, harici komutlar─▒ ├ža─č─▒rman─▒za ve bunlar─▒ giri┼č / ├ž─▒k─▒┼č / hata borular─▒na (stdin, stdout ve stderr) ba─člaman─▒za izin verir. Alt i┼člem ├žal─▒┼čan komutlar i├žin varsay─▒lan se├žimdir, ancak bazen di─čer mod├╝ller daha iyidir.

 subprocess.run(["ls", "-l"]) # Run command
subprocess.run(["ls", "-l"], stdout=subprocess.PIPE) # This will run the command and return any output
subprocess.run(shlex.split("ls -l")) # You can also use the shlex library to split the command
 

i┼čletim sistemi

os "i┼čletim sistemine ba─čl─▒ i┼člevsellik" i├žin kullan─▒l─▒r. Ayn─▒ zamanda harici komutlar─▒ ├ža─č─▒rmak i├žin kullan─▒labilir os.system ve os.popen (Not: Orada da bir subprocess.popen). os her zaman kabu─ču ├žal─▒┼čt─▒racak ve ihtiyac─▒ olmayan veya nas─▒l kullan─▒laca─č─▒n─▒ bilmeyen insanlar i├žin basit bir alternatiftir subprocess.run .

 os.system("ls -l") # run command
os.popen("ls -l").read() # This will run the command and return any output
 

sh

sh, programlar─▒ sanki i┼člevmi┼č gibi ├ža─č─▒rman─▒za izin veren bir alt i┼člem arabirimidir. Bir komutu birden ├žok kez ├žal─▒┼čt─▒rmak istiyorsan─▒z bu kullan─▒┼čl─▒d─▒r.

 sh.ls("-l") # Run command normally
ls_cmd = sh.Command("ls") # Save command as a variable
ls_cmd() # Run command as if it were a function
 

plumbum

plumbum, "script benzeri" Python programlar─▒ i├žin bir k├╝t├╝phanedir. ─░┼člevler gibi programlar─▒ oldu─ču gibi ├ža─č─▒rabilirsiniz sh . Plumbum kabuksuz bir boru hatt─▒ ├žal─▒┼čt─▒rmak istiyorsan─▒z kullan─▒┼čl─▒d─▒r.

 ls_cmd = plumbum.local("ls -l") # get command
ls_cmd() # run command
 

pexpect

pexpect, alt uygulamalar─▒ ├╝retmenize, kontrol etmenize ve ├ž─▒kt─▒lar─▒nda kal─▒plar─▒ bulman─▒za olanak sa─člar. Bu, Unix'te bir tty bekleyen komutlar i├žin alt i┼člemlere daha iyi bir alternatiftir.

 pexpect.run("ls -l") # Run command as normal
child = pexpect.spawn('scp foo [email protected]:.') # Spawns child application
child.expect('Password:') # When this is the output
child.sendline('mypassword')
 

kuma┼č

kuma┼č Python 2.5 ve 2.7 k├╝t├╝phanesidir. Yerel ve uzak kabuk komutlar─▒n─▒ ├žal─▒┼čt─▒rman─▒za izin verir. Kuma┼č, komutlar─▒ g├╝venli bir kabukta (SSH) ├žal─▒┼čt─▒rmak i├žin basit bir alternatiftir

 fabric.operations.local('ls -l') # Run command as normal
fabric.operations.local('ls -l', capture = True) # Run command and receive output
 

el├ži

el├ži "insanlar i├žin alt s├╝re├ž" olarak bilinir. subprocess Mod├╝l├╝n ├ževresinde uygun bir ambalaj olarak kullan─▒l─▒r .

 r = envoy.run("ls -l") # Run command
r.std_out # get output
 

komutlar

commands i├žin sarma i┼člevlerini i├žerir os.popen , ancak subprocess daha iyi bir alternatif oldu─čundan Python 3'ten kald─▒r─▒lm─▒┼čt─▒r .

D├╝zenleme, JF Sebastian'─▒n yorumuna dayan─▒yordu.


77







Her zaman fabric b├Âyle ┼čeyler i├žin kullan─▒r─▒m :

 from fabric.operations import local
result = local('ls', capture=True)
print "Content:/n%s" % (result, )
 

Ancak bu iyi bir ara├ž gibi g├Âr├╝n├╝yor: sh (Python alt i┼člem aray├╝z├╝) .

Bir ├Ârne─če bak:

 from sh import vgdisplay
print vgdisplay()
print vgdisplay('-v')
print vgdisplay(v=True)
 

64







"Pexpect" Python k├╝t├╝phanesini de kontrol edin.

Harici programlar─▒n / komutlar─▒n, hatta ssh, ftp, telnet'in, vb. Etkile┼čimli olarak kontrol edilmesine olanak tan─▒r.

 child = pexpect.spawn('ftp 192.168.0.24')

child.expect('(?i)name .*: ')

child.sendline('anonymous')

child.expect('(?i)password')
 

63







Arad─▒─č─▒n─▒z komutun ├ž─▒kt─▒s─▒na ihtiyac─▒n─▒z varsa, subprocess.check_output (Python 2.7+) komutunu kullanabilirsiniz .

 >>> subprocess.check_output(["ls", "-l", "/dev/null"])
'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'
 

Ayr─▒ca kabuk parametresini not edin .

Kabuk ise True , belirtilen komut kabuktan ├žal─▒┼čt─▒r─▒l─▒r. Python'u, ├žo─ču sistem kabu─čunda sundu─ču geli┼čmi┼č kontrol ak─▒┼č─▒ i├žin kullan─▒yorsan─▒z ve yine de kabuk borular─▒, dosya ad─▒ joker karakterleri, ortam de─či┼čken geni┼člemesi ve ~ bir kullan─▒c─▒n─▒n evine geni┼čletme gibi di─čer kabuk ├Âzelliklerine kolay eri┼čim sa─člamak istiyorsan─▒z, bu yararl─▒ olabilir. dizin. Ancak, not Python kendisinin uygulamalar─▒n─▒ sundu─ču bir├žok kabuk gibi ├Âzellikleri (├Âzellikle glob , fnmatch , os.walk() , os.path.expandvars() , os.path.expanduser() , ve shutil ).


61







Standart K├╝t├╝phaneli

Alt i┼člem mod├╝l├╝n├╝ kullan (Python 3):

 import subprocess
subprocess.run(['ls', '-l'])
 

├ľnerilen standart yoldur. Bununla birlikte, daha karma┼č─▒k g├Ârevler (borular, ├ž─▒kt─▒lar, girdiler vb.) Olu┼čturmak ve yazmak i├žin can s─▒k─▒c─▒ olabilir.

Python s├╝r├╝m├╝yle ilgili not: Hala Python 2 kullan─▒yorsan─▒z, subprocess.call benzer ┼čekilde ├žal─▒┼č─▒r.

ProTip: shlex.split i├žin komutu ayr─▒┼čt─▒rmak i├žin yard─▒mc─▒ olabilir run , call ve di─čer subprocess durumda fonksiyonlar─▒ istemedi─činiz (ya yapamazs─▒n!) Listeleri ┼čeklinde bunlar─▒ sa─člamak:

 import shlex
import subprocess
subprocess.run(shlex.split('ls -l'))
 

D─▒┼č Ba─č─▒ml─▒l─▒klar ile

D─▒┼č ba─č─▒ml─▒l─▒klar─▒ ├Ânemsemiyorsan─▒z , plumbum kullan─▒n :

 from plumbum.cmd import ifconfig
print(ifconfig['wlan0']())
 

En iyi subprocess sarmalay─▒c─▒d─▒r. ├çapraz platformdur, yani hem Windows hem de Unix benzeri sistemlerde ├žal─▒┼č─▒r. Taraf─▒ndan y├╝kleyin pip install plumbum .

Ba┼čka bir pop├╝ler k├╝t├╝phane sh :

 from sh import ifconfig
print(ifconfig('wlan0'))
 

Ancak, sh Windows deste─či d├╝┼čt├╝, bu y├╝zden eskisi gibi m├╝kemmel de─čil. Taraf─▒ndan y├╝kleyin pip install sh .


59







Ben buyruklar─▒m─▒ b├Âyle ├žal─▒┼čt─▒r─▒yorum. Bu kod hemen hemen ihtiyac─▒n─▒z olan her ┼čeye sahiptir

 from subprocess import Popen, PIPE
cmd = "ls -l ~/"
p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip()
 

49







G├╝ncelle┼čtirme:

subprocess.run Kodunuzun ├Ânceki Python s├╝r├╝mleriyle uyumlulu─čunu s├╝rd├╝rmesi gerekmiyorsa , Python 3.5'ten itibaren ├Ânerilen yakla┼č─▒m budur . Daha tutarl─▒ ve El├ži ile benzer kullan─▒m kolayl─▒─č─▒ sunuyor. (Borular olsa da kolay de─čil. Nas─▒l yap─▒laca─č─▒ i├žin bu soruya bak─▒n .)

─░┼čte dok├╝manlardan baz─▒ ├Ârnekler .

Bir i┼člem y├╝r├╝t├╝n:

 >>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
 

Ba┼čar─▒s─▒z olan ko┼čuda y├╝kseltme:

 >>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
 

Yakalama ├ž─▒k─▒┼č─▒:

 >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
 

Orijinal cevap:

Envoy'u denemeyi tavsiye ederim . Alt s├╝re├žler i├žin bir sarmalay─▒c─▒d─▒r ve s─▒rayla eski mod├╝lleri ve fonksiyonlar─▒ de─či┼čtirmeyi ama├žlar . El├ži insanlar i├žin alt s├╝re├žtir.

Beniokudan ├Ârnek kullan─▒m :

 >>> r = envoy.run('git config', data='data to pipe in', timeout=2)

>>> r.status_code
129
>>> r.std_out
'usage: git config [options]'
>>> r.std_err
''
 

Boru par├žalar─▒ da etrafta:

 >>> r = envoy.run('uptime | pbcopy')

>>> r.command
'pbcopy'
>>> r.status_code
0

>>> r.history
[<Response 'uptime'>]
 

46


2012-11-15





Sonu├ž ├ž─▒kt─▒s─▒ olmadan:

 import os
os.system("your command here")
 

Sonu├ž ├ž─▒kt─▒s─▒ ile:

 import commands
commands.getoutput("your command here")
or
commands.getstatusoutput("your command here")
 

37







https://docs.python.org/2/library/subprocess.html

... ya da ├žok basit bir komut i├žin:

 import os
os.system('cat testfile')
 

32







Orada da Plumbum

 >>> from plumbum import local
>>> ls = local["ls"]
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
>>> notepad = local["c:\\windows\\notepad.exe"]
>>> notepad()                                   # Notepad window pops up
u''                                             # Notepad window is closed by user, command returns
 

31







os.system Tamam, ama biraz tarihli. Ayn─▒ zamanda ├žok g├╝venli de─čil. Bunun yerine, deneyin subprocess . subprocess do─črudan sh demez ve bundan daha g├╝venlidir os.system .

Daha fazla bilgi al─▒n burada .


30







Python'da harici bir komut ├ža─č─▒rmak

subprocess.run Bir CompletedProcess nesneyi d├Ând├╝ren basit, kullan─▒m :

 >>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)
 

Niye ya?

Python 3.5'ten itibaren , belgeler subprocess.run'u ├Ânerir :

Alt i┼člemlerin ba┼člat─▒lmas─▒ i├žin ├Ânerilen yakla┼č─▒m, kullanabilece─či t├╝m kullan─▒m durumlar─▒nda run () i┼člevini kullanmakt─▒r. Daha geli┼čmi┼č kullan─▒m durumlar─▒ i├žin, temel Popen aray├╝z├╝ do─črudan kullan─▒labilir.

─░┼čte m├╝mk├╝n olan en basit kullan─▒m─▒n bir ├Ârne─či - ve aynen istendi─či gibi:

 >>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)
 

run komutun ba┼čar─▒yla tamamlanmas─▒n─▒ bekler, sonra bir CompletedProcess nesneyi d├Ând├╝r├╝r . Bunun yerine y├╝kseltir TimeoutExpired (e─čer timeout= tart─▒┼č─▒rsan─▒z) veya CalledProcessError (ba┼čar─▒s─▒z olursa ve ge├žerseniz check=True ).

Yukar─▒daki ├Ârnekten anla┼č─▒labilece─či gibi, stdout ve stderr, varsay─▒lan olarak kendi stdout'unuza ve stderr'inize aktar─▒l─▒r.

D├Ând├╝r├╝len nesneyi inceleyebilir ve verilen komutu ve d├Ân├╝┼č kodunu g├Ârebiliriz:

 >>> completed_process.args
'python --version'
>>> completed_process.returncode
0
 

├ç─▒k─▒┼č yakalama

├ç─▒kt─▒y─▒ yakalamak istiyorsan─▒z subprocess.PIPE , uygun olana ge├žebilirsiniz stderr veya stdout :

 >>> cp = subprocess.run('python --version', 
                        stderr=subprocess.PIPE, 
                        stdout=subprocess.PIPE)
>>> cp.stderr
b'Python 3.6.1 :: Anaconda 4.4.0 (64-bit)\r\n'
>>> cp.stdout
b''
 

(S├╝r├╝m bilgisinin stdout yerine stderr'e konmas─▒ ilgin├ž ve biraz sezgisel buluyorum.)

Bir komut listesi iletin

Bir programl─▒ olarak olu┼čturulmu┼č bir dize sa─člamaya kolayca bir komut dizesi sa─člamaktan (soru sordu─ču gibi) kolayl─▒kla ge├žebilir. Dizeleri programl─▒ olarak olu┼čturma. Bu potansiyel bir g├╝venlik sorunudur. Girdiye g├╝venmedi─činizi varsaymak daha iyidir.

 >>> import textwrap
>>> args = ['python', textwrap.__file__]
>>> cp = subprocess.run(args, stdout=subprocess.PIPE)
>>> cp.stdout
b'Hello there.\r\n  This is indented.\r\n'
 

Not, sadece args konumsal olarak ge├žirilmelidir.

Tam ─░mza

─░┼čte kaynaktaki as─▒l imza ve a┼ča─č─▒da g├Âsterildi─či gibi help(run) :

 def run(*popenargs, input=None, timeout=None, check=False, **kwargs):
 

popenargs Ve kwargs verilen Popen yap─▒c─▒. alt i┼člemin stdinine aktar─▒lacak input olan bir bayt dizisi (veya kodlamay─▒ belirtirseniz unicode veya universal_newlines=True ) olabilir.

Belgeler a├ž─▒klad─▒ timeout= ve check=True benden daha iyi:

Zaman a┼č─▒m─▒ arg├╝man─▒ Popen.communicate () ├Â─česine iletilir. Zaman a┼č─▒m─▒ s├╝resi doldu─čunda, ├žocuk s├╝reci ├Âld├╝r├╝lecek ve beklenecek. Alt i┼člem sona erdikten sonra TimeoutExpired ├Âzel durumu yeniden olu┼čturulacak.

E─čer kontrol do─čruysa ve s├╝re├ž s─▒f─▒r olmayan bir ├ž─▒k─▒┼č koduyla ├ž─▒karsa, CalledProcessError istisnas─▒ ortaya ├ž─▒kar. Bu istisnan─▒n ├Âzellikleri arg├╝manlar─▒, ├ž─▒k─▒┼č kodunu ve e─čer yakalan─▒rsa stdout ve stderr'yi tutar.

ve bu ├Ârnek check=True , bulabilece─čimden daha iyi:

 >>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
 

Geni┼čletilmi┼č ─░mza

─░┼čte belgelerde belirtildi─či gibi geni┼čletilmi┼č bir imza:

 subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, 
shell=False, cwd=None, timeout=None, check=False, encoding=None, 
errors=None)
 

Bunun sadece ark listesinin konumsal olarak iletilmesi gerekti─čini g├Âsterdi─čini unutmay─▒n. Kalan arg├╝manlar─▒ anahtar s├Âzc├╝k arg├╝manlar─▒ olarak iletin

popen

Yerine ne zaman kullan─▒l─▒r Popen ? Sadece tart─▒┼čmalara dayanarak kullan─▒m ├Ârne─či bulmakta zorlan─▒rd─▒m. Popen Bununla birlikte, do─črudan kullan─▒m─▒ poll , 'send_signal', 'sonland─▒r' ve 'bekle' gibi y├Ântemlerine eri┼čmenizi sa─člar .

─░┼čte kaynakta Popen verilen imza . Bunun, bilginin en kesin kaps├╝llenmesi oldu─čunu d├╝┼č├╝n├╝yorum (aksine ):https://github.com/python/cpython/blob/master/Lib/subprocess.py%23L587#L587 help(Popen)

 def __init__(self, args, bufsize=-1, executable=None,
             stdin=None, stdout=None, stderr=None,
             preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
             shell=False, cwd=None, env=None, universal_newlines=False,
             startupinfo=None, creationflags=0,
             restore_signals=True, start_new_session=False,
             pass_fds=(), *, encoding=None, errors=None):
 

Ama daha bilgilendirici belgeler : Popen

 subprocess.Popen(args, bufsize=-1, executable=None, stdin=None,
                 stdout=None, stderr=None, preexec_fn=None, close_fds=True,
                 shell=False, cwd=None, env=None, universal_newlines=False,
                 startupinfo=None, creationflags=0, restore_signals=True,
                 start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
 

Yeni bir s├╝re├žte bir ├žocuk program─▒ y├╝r├╝t├╝n. POSIX'de s─▒n─▒f, alt program─▒ y├╝r├╝tmek i├žin os.execvp () benzeri bir davran─▒┼č kullan─▒r. Windows'ta, s─▒n─▒f Windows CreateProcess () i┼člevini kullan─▒r. Popen arg├╝manlar─▒ a┼ča─č─▒daki gibidir.

Kalan belgelerin anla┼č─▒lmas─▒ Popen okuyucu i├žin bir al─▒┼čt─▒rma olarak b─▒rak─▒lacakt─▒r.


30







kullan─▒n:

 import os

cmd = 'ls -al'

os.system(cmd)
 

os - Bu mod├╝l i┼čletim sistemine ba─čl─▒ i┼člevselli─či kullanman─▒n ta┼č─▒nabilir bir yolunu sunar.

Daha fazla os fonksiyon i├žin, i┼čte belgeler.


25







Bu kadar basit olabilir:

 import os
cmd = "your command"
os.system(cmd)
 

25







os mod├╝l├╝n├╝ kullan

 import os
os.system("your command")
 

├ľrne─čin

 import os
os.system("ifconfig")
 

21







Burada daha ├Ânce belirtilmeyen ba┼čka bir fark var.

subprocess.Popen <command> '─▒ bir alt i┼člem olarak y├╝r├╝t├╝r. Benim durumumda, <b> ba┼čka bir programla ileti┼čim kurmas─▒ gereken <a> dosyas─▒n─▒ ├žal─▒┼čt─▒rmam gerekiyor, <b>.

Alt i┼člemi denedim ve y├╝r├╝tme ba┼čar─▒l─▒ oldu. Ancak <b> <a> ile ileti┼čim kuramad─▒. Her ikisini de terminalden ├žal─▒┼čt─▒rd─▒─č─▒mda her ┼čey normal.

Bir tane daha: (NOT: kwrite di─čer uygulamalardan farkl─▒ davran─▒r. A┼ča─č─▒dakini Firefox ile denerseniz, sonu├ž ayn─▒ olmaz.)

E─čer denerseniz os.system("kwrite") , program ak─▒┼č donar kullan─▒c─▒ kapan─▒r KWRITE kadar. Bunun ├╝stesinden gelmek i├žin bunun yerine denedim os.system(konsole -e kwrite) . Bu sefer program akmaya devam etti, ancak kwrite konsolun alt i┼člemi oldu.

Herkes kwrite'─▒ alt i┼člem olarak ├žal─▒┼čt─▒rmaz (├Ârn. Sistem monit├Âr├╝nde a─čac─▒n en sol kenar─▒nda g├Âr├╝nmesi gerekir).


20







subprocess.check_call d├Ân├╝┼č de─čerlerini test etmek istemiyorsan─▒z kullan─▒┼čl─▒d─▒r. Herhangi bir hataya istisna atar.


19







Sublex ile birlikte alt i┼člemi kullanma e─čilimindeyim (al─▒nt─▒lanan dizgelerin ka├ž─▒┼č─▒n─▒ ele almak i├žin):https://docs.python.org/2/library/shlex.html

 >>> import subprocess, shlex
>>> command = 'ls -l "/your/path/with spaces/"'
>>> call_params = shlex.split(command)
>>> print call_params
["ls", "-l", "/your/path/with spaces/"]
>>> subprocess.call(call_params)
 

19







Sadeli─či i├žin shell_command'─▒ olduk├ža seviyorum . Alt i┼člem mod├╝l├╝n├╝n ├╝st├╝ne in┼ča edilmi┼čtir.

─░┼čte dok├╝manlardan bir ├Ârnek:

 >>> from shell_command import shell_call
>>> shell_call("ls *.py")
setup.py  shell_command.py  test_shell_command.py
0
>>> shell_call("ls -l *.py")
-rw-r--r-- 1 ncoghlan ncoghlan  391 2011-12-11 12:07 setup.py
-rw-r--r-- 1 ncoghlan ncoghlan 7855 2011-12-11 16:16 shell_command.py
-rwxr-xr-x 1 ncoghlan ncoghlan 8463 2011-12-11 16:17 test_shell_command.py
0
 

19







os.system sonu├žlar─▒ saklaman─▒za izin vermez, bu nedenle sonu├žlar─▒ bir listede saklamak veya ba┼čka bir ┼čey yapmak istiyorsan─▒z subprocess.call .


18







Utanmaz fi┼č, bunun i├žin bir k├╝t├╝phane yazd─▒m: P https://github.com/houqp/shell.py

Temelde ┼ču an i├žin popen ve shlex i├žin bir sar─▒c─▒. Ayr─▒ca, boru komutlar─▒n─▒ da destekler, b├Âylece Python'da komutlar─▒ daha kolay zincirleyebilirsiniz. B├Âylece ┼č├Âyle ┼čeyler yapabilirsiniz:

 ex('echo hello shell.py') | "awk '{print $2}'"
 

15







Linux alt─▒nda, ba─č─▒ms─▒z olarak ├žal─▒┼čacak harici bir komut ├ža─č─▒rmak istemeniz durumunda (python beti─či sona erdikten sonra ├žal─▒┼čmaya devam eder), g├Ârev biriktiricisi veya at komutu olarak basit bir s─▒ra kullanabilirsiniz.

G├Ârev biriktiricisine bir ├Ârnek:

 import os
os.system('ts <your-command>')
 

G├Ârev biriktiricisi ( ts ) hakk─▒nda notlar :

  1. ├çal─▒┼čt─▒r─▒lacak e┼čzamanl─▒ i┼člem say─▒s─▒n─▒ ("yuvalar") ┼ču ┼čekilde ayarlayabilirsiniz:

    ts -S <number-of-slots>

  2. Y├╝klemek ts y├Ânetici ayr─▒cal─▒klar─▒ gerektirmez. Kaynaktan basit bir ┼čekilde indirebilir ve derleyebilir make , yolunuza ekleyebilir ve i┼činiz biter.


14







Popen'i kullanabilir ve sonra prosed├╝r├╝n durumunu kontrol edebilirsiniz:

 from subprocess import Popen

proc = Popen(['ls', '-l'])
if proc.poll() is None:
    proc.kill()
 

Alt s├╝reci kontrol edin .


14



─░lgili yay─▒nlar


Javadoc'ta harici bir URL'ye mi ba─član─▒l─▒yor?

Python'da ÔÇťSyntaxError:ÔÇť Yazd─▒rmak ÔÇŁ├ža─čr─▒s─▒ s─▒ras─▒nda parantezin eksik olmas─▒ ne anlama geliyor?

Python'da Bash komutlar─▒n─▒ ├žal─▒┼čt─▒rma

PowerShell'deki ├ž─▒kt─▒y─▒ harici bir i┼člemden bir de─či┼čkene nas─▒l yakalar─▒m?

Python'da bo┼č bir dize b├Âl├╝nd├╝─č├╝nde, split ('\ n') [''] d├Ând├╝r├╝rken split () neden bo┼č bir liste d├Ând├╝r├╝yor?

Angular2ÔÇÖde harici bir URLÔÇÖye nas─▒l y├Ânlendirilir?

Python terc├╝man kabu─čunda son komut nas─▒l tekrarlan─▒r?

Harici bir komutu Python'dan e┼čzamans─▒z olarak nas─▒l ├žal─▒┼čt─▒rabilirim?

PHP komut isteminde bir i├ž veya d─▒┼č komut olarak tan─▒nm─▒yor

Python'da ├ža─č─▒ran fonksiyonun mod├╝l├╝n├╝n __name__ ismini al─▒n

Etiketle ilgili di─čer sorular [python]


Git mergetool istenmeyen .orig dosyalar─▒ olu┼čturur

Ne & lt; ve & gt; dayanmak m─▒?

IPv4 i├žin izin verilen en b├╝y├╝k TCP / IP a─č ba─člant─▒ noktas─▒ numaras─▒ nedir?

CocoaPods kullan─▒yorsan─▒z .gitignore'a ne gider?

Bir dizinin JavaScript'te ba┼čka bir dizinin herhangi bir ├Â─česini i├žerip i├žermedi─čini kontrol edin

Maven 3 build.plugins.plugin.version hakk─▒nda uyar─▒lar

HTML dosyalar─▒n─▒ yaln─▒zca kaynaklar─▒n─▒ g├Âr├╝nt├╝lemek yerine do─črudan GitHub'dan ├žal─▒┼čt─▒rabilir miyim?

─░fadede bir kabu─čunda birden fazla ko┼čul nas─▒l temsil edilir?

Mobil d├╝zende Bootstrap 3 s├╝tun s─▒ras─▒n─▒ nas─▒l de─či┼čtiririm?

CHECKED istisnalar─▒n─▒ Java 8 ak─▒┼člar─▒n─▒n i├žinden nas─▒l f─▒rlatabilirim?