Pythonda xarici komandanlığı çağırın

Python skriptindən xarici komanda (necə Unix shell və ya Windows komanda satırına yazdığım kimi) deyə bilərəm?

3987
18 сент. freshWoWer 18 sentyabrda təyin olunur . 2008-09-18 04:35 '08 saat 04:35 'da 2008-09-18 04:35
@ 55 cavab
  • 1
  • 2

Standart kitabxanada subprocess moduluna baxın:

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

Subprocess sisteminin müqayisəsi üstünlüyü bu daha çevikdir (stdout, stderr, "real" statusu kodu, daha yaxşı səhvlərin idarə edilməsi və s.).

Rəsmi sənədlər alternativ os.system () yerinə subprocess modulunu tövsiyə edir:

Subprocess modulu yeni prosesləri yumurtlama və onların nəticələrini əldə etmək üçün daha güclü vasitələr təmin edir; bu modulu istifadə edərək, bu funksiyanı [ os.system() ] istifadə etmək os.system() .

Alt proses sənədlərində " Köhnə funksiyaları subprocess modul ilə əvəz " bölməsi bir neçə faydalı reseptə malik ola bilər.

3823
18 сент. Sep 18-də David Cournapeau tərəfindən verilmiş cavab 2008-09-18 04:39 '08 da 4:39 'də 2008-09-18 04:39' da

Xarici proqramları necə çağırmaq və onların hər birinin üstünlükləri və mənfi cəhətləri:

  • os.system("some_command with args") əmr və dəlilləri sistem kabuğuna keçir. Bu yaxşıdır, çünki bir anda bir neçə əmri çalıştıra və kanalları və I / O redirectionunu konfiqurasiya edə bilərsiniz. Məsələn:

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

    Buna baxmayaraq, bu rahat olsa da, boşluqlar və s. Kimi kabuk simvollarının qaçışını əl ilə idarə etməlisiniz. Digər tərəfdən, həm də, həqiqətən, xarici proqramları deyil, yalnız kabuk komutları olan əmrləri çalıştırmanıza imkan verir. Sənədlərə baxın.

  • stream = os.popen("some_command with args") os.system kimi eyni işi yerinə os.system , bunun üçün standart I / O-a daxil olmaq üçün istifadə edə biləcəyiniz fayl kimi bir obyekt verir. prosesi. İ / o bir az fərqli idarə 3 daha popen variantları var. Hər şeyi simli olaraq keçirsəniz, əmriniz qabığa keçirilir; Əgər onları siyahıya keçirsəniz, onda bir şeydən qaçmaqdan narahat olmayın. Sənədlərə baxın.

  • Class Popen modulu subprocess . Bu, os.popen əvəz etmək üçün nəzərdə tutulmuşdur, lakin bu, o qədər də geniş deyil ki, bir az daha mürəkkəbdir ki, dezavantajlıdır. Məsələn, deyərdiniz:

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

    əvəzinə:

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

    lakin bütün variantları birləşdirilmiş sinifdə 4 müxtəlif popen funksiyası yerinə yetirmək gözəldir. Sənədlərə baxın.

  • subprocess modulundan call funksiyası. Bu, əsasən, Popen sinfi ilə Popen və eyni arqumentləri alır, amma əmrini başa çatdırmaq üçün gözləyir və geri qaytarma kodunu alacaqsınız. Məsələn:

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

    Sənədlərə baxın.

  • Python 3.5 və ya daha sonra istifadə subprocess.run , yuxarıda göstərilənlərə çox yaxın olan yeni subprocess.run funksiyasından istifadə edə bilərsiniz, lakin daha da çevik və əmr tamamlananda CompletedProcess obyektini qaytarır.

  • OS modulunda da C proqramında olan bütün fork / exec / spawn funksiyaları var, amma onları birbaşa istifadə etməyi məsləhət görmürəm.

subprocess modulu, ehtimal etdiyiniz şey olmalıdır.

border=0

Nəhayət, yəqin ki, kabellərin bir simli olaraq icra ediləcəyi son əmri keçdiyiniz bütün üsullar üçün onu silmək üçün məsuliyyət daşıyırsınız. Verilən magistralın hər hansı bir hissəsi tamamilə etibarlı ola bilməyəcəyi təqdirdə ciddi təhlükəsizlik təsiri var . Məsələn, əgər istifadəçi hər hansı bir hissəyə daxil olursa / simli bir hissəsi olur. Əgər əmin deyilsinizsə, bu metodları yalnız sabitlərlə istifadə edin. Sizə bir nəticə vermək üçün bu kodu nəzərdən keçirin:

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

və istifadəçinin "mənim anam məni sevmədiyi və rm -rf /" girdiyini təsəvvür edin.

2635
18 сент. Cavab Eli Courtwright tərəfindən verilir . 2008-09-18 16:11 '08 at 4:11 pm 2008-09-18 16:11

Mən adətən istifadə edirəm:

 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() 

stdout məlumatları ilə istədiyiniz şeyi edə bilərsiniz. Əslində, bu parametrləri ( stdout=stderr= ) sadəcə buraxa bilərsiniz və os.system() kimi os.system() .

290
18 сент. Cavab EmmEff 18 sep tərəfindən verilir . 2008-09-18 21:20 '08 at 21:20 pm 2008-09-18 21:20

Çağırıcıdan uşaq prosesini ayırmaq üçün bəzi məsləhətlər (uşaq prosesini arxa planda qaçır).

Bir CGI skriptindən uzun bir vəzifəni yerinə yetirmək istəyirik, yəni, uşaq prosesi bir CGI skriptinin icrası prosesindən daha uzun müddət yaşamalıdır.

Subprocess modul sənədlərindən klassik nümunə:

 import subprocess import sys # some code here pid = subprocess.Popen([sys.executable, "longtask.py"]) # call subprocess # some more code here 

Buradaki fikir, longtask.py tamamlanana qədər "zəng sub" subprocessində gözləmək istəmirsiniz. Ancaq nümunədən xəttdən sonra "burada bir daha kod" nə baş verdiyi aydın deyil.

Mənim hədəf platformum pulsuzdi, amma inkişaf Windows'da idi, mən ilk olaraq Windows-da bir problemlə üzləşdim.

Windows (win xp), ana proses uzuntask.py işini tamamlayana qədər tamamlanmayacaq. Bu bir CGI skriptində istədiyiniz nə deyil. Problem Python üçün xüsusi deyil, PHP icmasının problemləri eynidır.

Çözüm, DETACHED_PROCESS prosesinin yaradılması bayrağının qazanmaq API'sindəki əsas CreateProcess funksiyasına keçməkdir. Pywin32 quraşdırdıysanız, bayraqdan win32process modulundan idxal edə bilərsiniz, əks halda onu özünüz müəyyənləşdirməlisiniz:

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

/ * UPD 2015.10.27 Aşağıdakı şərhlərdə @eryksun semantik cəhətdən düzgün bayraq olduğunu qeyd edir: CREATE_NEW_CONSOLE (0x00000010) * /

Freebsddə başqa bir problem yaranır: valideyn prosesi başa çatdıqda da uşaq proseslərini dayandırır. Və bu bir CGI skriptində istədiyiniz nə deyil. Bəzi təcrübələr, problemin sys.stdout paylaşımında olduğu görünür. Və iş qərarı belə idi:

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

Kodları digər platformalarda yoxlamadı və freebsd-də davranışın səbəblərini bilmirik. Hər kəs bilirsə, fikirlərinizi paylaşın. Python-da arka plan proseslərini işləyərkən Googling hələ yüngül bir şey deyil.

182
12 февр. cavab 12 fevralda verildi 2010-02-12 13:15 '10 at 13:15 2010-02-12 13:15

Os.system yerinə subprocess modulundan istifadə etməyi məsləhət görürəm, çünki sizin üçün əlil və buna görə də daha təhlükəsizdir: http://docs.python.org/library/subprocess.html

 subprocess.call(['ping', 'localhost']) 
113
18 сент. Cavabın cavabı 18 martda verildi . 2008-09-18 04:42 '08 saat 04:42 'de 2008-09-18 04:42' de
 import os cmd = 'ls -al' os.system(cmd) 

Komanda nəticələrini qayıtmaq istəyirsinizsə, os.popen istifadə edə bilərsiniz. Buna baxmayaraq, bu, 2.6-cı ildən bəri subprocess modulunun lehinə olduğundan , digər cavabların yaxşı qiymətləndirildiyi üçün qadağan edilmişdir.

110
18 сент. Alexandra Franks tərəfindən 18 Sentyabrda cavab verildi 2008-09-18 04:37 '08 saat 04:37 'da 2008-09-18 04:37' də
 import os os.system("your command") 

Bu əmr təhlükəli olduğundan əmr təmizlənməyib. Google-da "os" və "sistem" modulları ilə bağlı müvafiq sənədlər üçün sizin üçün buraxın. Bu cür şeyləri edəcəyimiz bir sıra funksiyalar var (exec * və spawn *).

97
18 сент. Cavish nimish 18 sep tərəfindən verilir . 2008-09-18 04:37 '08 saat 04:37 'da 2008-09-18 04:37' də

Python istifadə edərək xarici əmrləri zəng etməyə imkan verən bir çox müxtəlif kitabxanalar var. Hər bir kitabxana üçün bir təsviri verdim və xarici komandanlığı çağırmaq üçün bir nümunə göstərdim. Məsələn, ls -l (bütün faylların siyahısını) istifadə etdim. Listelenmiş olduğum kitabxanalardan hər hansı biri haqqında daha çox məlumat əldə etmək istəyirsinizsə və onların hər biri üçün sənədləri bağlayın.

Mənbələr:

Bunlar bütün kitabxanalardır:

Hansı kitabxanadan istifadə edəcəyinizə qərar verməyinizə ümid edirəm :)

subprocess

Subprocess, xarici komutları çağırmağa və onların giriş / çıxış / səhv kanallarına (stdin, stdout və stderr) qoşulmağa imkan verir. Subprocess əmrləri yerinə yetirmək üçün default seçimdir, lakin bəzən digər modullar daha yaxşıdır.

 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 

OS

os əməliyyat sisteminə bağlı funksionallıq üçün istifadə olunur. O, os.systemos.popen istifadə edərək xarici əmrləri dəvət etmək üçün istifadə edilə bilər (Qeyd: bir subprocess var .popen). os həmişə bir qövs qaçacaq və ehtiyacı olmayan insanlar üçün basit bir alternativdir və ya subprocess.run necə istifadə subprocess.run .

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

sh

sh proqramları funksiya kimi sanki zəng etməyə imkan verən bir subprocess interfeysi. Bir neçə dəfə bir komanda çalıştırmak istəyirsinizsə bu faydalı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 

Qurğuşun

plumbum "skript kimi" Python proqramları üçün bir kitabxana. Siz sh kimi funksiyaları kimi proqramları zəng edə bilərsiniz. Plumbum, bir boru kəməri olmadan bir kəmər çəkmək istəsəniz faydalıdır.

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

pexpect

pexpect, uşaq proqramları yaratmaq, onları idarə etmək və sərbəst şəkildə nümunələri tapmaq üçün imkan verir. Bu Unix-də qeyri-tty əmrləri üçün ən yaxşı subprocessdir.

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

parça

parça Python 2.5 və 2.7 kitabxanasıdır. Yerli və uzaq kabuk komutlarını icra etməyə imkan verir. Parça təhlükəsiz qabığın (SSH) əmrlərini yerinə yetirmək üçün sadə bir alternativdir.

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

peyğəmbər

elçi "insanlar üçün subprocess" kimi tanınır. subprocess modulu ətrafında rahat örtük kimi istifadə olunur.

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

Komandalar

commands os.popen üçün sarma funksiyalarını ehtiva edir, lakin subprocess ən yaxşı alternativ olduğundan Python 3-dən çıxarılır.

Redaktə JF Sebastianın şərhinə əsaslanır.

60
29 окт. Tom Fullerə 29 Oktyabr cavab verin 2016-10-29 17:02 '16 'da 17:02 2016-10-29 17:02

Mən həmişə belə şeylər üçün fabric istifadə edirəm:

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

Amma bu yaxşı bir vasitə kimi görünür: sh (Python subprocess interface) .

Bir nümunəyə baxın:

 from sh import vgdisplay print vgdisplay() print vgdisplay('-v') print vgdisplay(v=True) 
59
13 марта '12 в 3:12 2012-03-13 03:12 Cavab 13 mart 2012-ci il tarixində Jorge E. Cardona tərəfindən 3:12 2012-03-13 03:12

Həm də Python kitabxanasına "pexpect" də baxın.

Bu, xarici proqramların / əmrlərin, hətta ssh, ftp, telnet və s. Yalnız bir şey yaza bilərsiniz:

 child = pexpect.spawn('ftp 192.168.0.24') child.expect('(?i)name .*: ') child.sendline('anonymous') child.expect('(?i)password') 
57
07 окт. Athanassisə Oct 07 verildi . 2010-10-07 10:09 '10 at 10:09 2010-10-07 10:09

Çağırdığınız komandan çıxışa ehtiyac varsa, subprocess.check_output (Python 2. 7+) istifadə edə bilərsiniz.

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

Həmçinin qabığın seçimini qeyd edin.

Qabıq True olduqda, müəyyən əmr qabığın içindən keçiriləcəkdir. Python'u ən çox sistem qabıqları üçün təqdim etdiyi qabaqcıl idarəetmə axını üçün istifadə edirsinizsə, bu da faydalı ola bilər və hələ də kabuklar, fayl joker, ətraf mühit dəyişən və digər kabuk funksiyalarına rahat giriş əldə etmək istəyirlər. istifadəçi kataloqu üçün uzadılması ~. Buna baxmayaraq, Python'un özü, bir çox kabuk funksiyasının (xüsusən, os.walk() , fnmatch , os.walk() , os.path.expandvars() , os.path.expanduser()shutil ) shutil .

52
28 апр. Facundo Casco tərəfindən verilən cavab 28 Apreldə 2011-04-28 23:29 '11 at 11:29 PM 2011-04-28 23:29

Standart kitabxana ilə

Modul subprocess istifadə (Python 3):

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

Tövsiyə olunan standart üsuldur. Bununla belə, daha mürəkkəb vəzifələr (borular, çıxışlar, giriş, və s.) Yaratmaq və yazmaq üçün yorucu ola bilər.

Python Qeyd: Python 2 istifadə etdiyiniz halda subprocess.call eyni şəkildə işləyir.

ProTip: shlex.split istəmədiyiniz halda (və ya ola bilməz) run , call və digər subprocess funksiyalarına əmr verməyə kömək edə bilər. Onları siyahılar şəklində subprocess :

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

Xarici bağımlılıklarla

Xarici bağımlılıklara qarşı deyilsinizsə , plumbum istifadə edin :

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

Bu ən yaxşı subprocess . Bu, cross-platformdur, yəni Windows və Unix kimi sistemləri üzərində işləyir. pip install plumbum üzərində pip install plumbum .

Digər məşhur kitabxana ş :

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

Buna baxmayaraq, sh Windows-un dəstək verməyini rədd etdi, buna görə də əvvəlki kimi təəccüblü deyil. pip install sh .

48
11 апр. Cavab Honza Javorek tərəfindən verilir. Apr 11 2013-04-11 20:17 '13 at 8:17 pm 2013-04-11 20:17

Mənim əmrlərim necədir. Bu kod sizə lazım olan hər şeyi ehtiva edir.

 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() 
43
28 окт. Cavab 28 oktyabrda Usman Xan tərəfindən verilir . 2012-10-28 08:14 '12 saat 08:14 'da 2012-10-28 08:14

Yeniləmə:

subprocess.run əvvəlki versiyaları ilə uyğunluğunu saxlamağa ehtiyac olmadıqda, subprocess.run Python 3.5-dən təklif olunan yanaşmadır. Bu daha ardıcıl və bir messenger kimi istifadə rahatlığı təklif edir. (Boru kəməri sadə deyil, ancaq bu suala baxın.)

Sənədlərin bəzi nümunələri.

Prosesi çalıştırın:

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

Artıq uğursuzluğu artırın:

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

Capture çıxış:

 >>> 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 cavab:

Mən elçi çalışıram. Subprocess üçün bir qabıqdır, bu da öz növbəsində köhnə modulları və funksiyaları əvəz etməyə çalışır . Bir xəbərdar insan üçün bir alt prosesdir.

Readme örneği:

 >>> 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 Dayanımı:

 >>> r = envoy.run('uptime | pbcopy') >>> r.command 'pbcopy' >>> r.status_code 0 >>> r.history [<Response 'uptime'>] 
41
15 нояб. Cavab 15 noyabr tarixində Joe tərəfindən verilir. 2012-11-15 20:13 '12 at 20:13 2012-11-15 20:13

Çıxış olmadan:

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

Nəticənin sərbəst buraxılması ilə:

 import commands commands.getoutput("your command here") or commands.getstatusoutput("your command here") 
33
18 апр. Zuckonit tərəfindən verilən cavabı Apr 18 2013-04-18 04:09 '13 at 4:09 2013-04-18 04:09

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

... və ya çox sadə bir əmr üçün:

 import os os.system('cat testfile') 
27
18 сент. Ben Hoffstein tərəfindən 18 sentyabrda cavab verildi 2008-09-18 04:43 '08 'də 4:43' də 2008-09-18 04:43 'da

Həm də bir plumbum var

 >>> 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 
26
10 окт. cavab verildi 10 ay. 2014-10-10 20:41 '14 at 20:41 2014-10-10 20:41

os.system OK, ancaq tarixli görünür. Bu da çox təhlükəsiz deyil. subprocess yerinə subprocess edin. subprocess birbaşa os.system daha təhlükəsizdir.

Burada daha çox məlumat əldə edin .

26
18 сент. Cavab Martin W 18 sep tərəfindən verilir . 2008-09-18 04:53 '08 at 4:53 2008-09-18 04:53

Pythonda xarici komandanlığı çağırın

Sadə, subprocess.run istifadə subprocess.run , bir CompletedProcess obyektini qaytarır:

 >>> 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) 

Niyə?

Python 3.5-də olduğu kimi, subprocess.run sənədlərdə tövsiyə olunur:

Subprocesses çağırmaq üçün tövsiyə yanaşma, idarə edə biləcək bütün istifadə halları üçün run () funksiyasından istifadə etməkdir. Daha inkişaf etmiş istifadə üçün Popen interfeysi birbaşa istifadə edilə bilər.

Burada ən sadə mümkün istifadə nümunəsi - və eyni şəkildə soruşur:

 >>> 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) 

əmrini tamamlamaq üçün əmr gözləyir və sonra bir CompletedProcess obyektini qaytarır. Bunun əvəzinə TimeoutExpired (arqument timeout= ) və ya CalledProcessError (əgər uğursuz və yoxsa check=True ) verə bilər.

Yuxarıdakı nümunədən bağlaya biləcəyiniz kimi, stdout və stderr həm də öz stdout və stderr-ə əvəzolunmazdır.

Qaytarılmış obyekti yoxlamaq və göstərilən əmr və qaytarma kodunu görə bilərik:

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

Çıxış çəkilişi

subprocess.PIPE almaq istəyirsinizsə, subprocess.PIPE müvafiq stderr və ya stdout keçə bilərsiniz:

 >>> 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'' 

(Mənə maraqlı və bir qədər mübahisəli versiya məlumatları stdout yerinə stderr daxil olur.)

Komanda siyahısını təqdim et

Kolaylıqla proqramlaşdırılmış olaraq bir simli yaratmaq üçün bir komanda xətti (məsələn, bir sual) əl ilə keçid edə bilərsiniz. Dizaynları programlı olaraq proqramlaşdırma. Bu potensial təhlükəsizlik məsələsidir. Girdi məlumatlarına güvənməməyiniz daha yaxşı olar.

 >>> 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' 

Qeyd edək ki, yalnız args vacibdir.

Tam imza

Burada mənbədə faktiki imza və göstərilən help(run) :

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

popenargskwargs Popen konstruktor təyin edilir. input , stdin alt prosesinə keçiriləcək baytların bir simli (və ya unicode, şifrələmə və ya universal_newlines=True ) input edilə bilər.

Sənədlər timeout=check=True məndən daha yaxşı olduğunu təsvir edir:

Timeout argümanı Popen.communicate () 'yə ötürülür. Vaxt aşdıqda, uşaq prosesi həlak olacaq və gözləyir. Uşaq müddəti bitdikdən sonra istisna TimeoutExpired yenidən qaldırılacaq.

Çek yoxsa və proses qeyri-sıfır çıxış kodu ilə bitirsə, CalledProcessError çağırışı qaldırılacaq. Bu istisnanın atributları, əsir tutulduqları halda, arqumentləri, çıxış kodu və stdout və stderr ehtiva edir.

bu nümunə check=True üçün düşündüyümdən daha yaxşıdır:

 >>> 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şləndirilmiş imza

Sənədlərdə göstərilən genişləndirilmiş imzadır:

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

Qeyd etmək lazımdır ki, bu, yalnız mübahisəli siyahıların yerləşdirilməsini tələb edir. Beləliklə, qalan arqumentləri açar sözü üçün arqumentlər olaraq verin.

Popen

Əvəzinə Popen istifadə Popen ? Yalnız arqumentlərə söykənən bir presedent tapmaq üçün mübarizə aparırdım. Ancaq, Popen istifadə edərək, 'send_signal', 'ending' və 'wait' poll daxil olmaqla, onun metodlarına daxil olmağı təmin edəcək.

Burada Popen göstərilən imza Popen . Hesab edirəm ki, bu məlumatın ən doğru şəkildə əhatə olunmasıdır help(Popen) fərqli olaraq 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): 

Lakin Popen sənədləri daha informativdir:

 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) 

Uşaq proqramını yeni prosesdə işləyin. POSIX-də, os.execvp () - uşaq proqramını yerinə yetirmək üçün bənzər bir davranış istifadə edir. Windows'da, sinif Windows CreateProcess () funksiyasından istifadə edir. Popendə arqumentlər:

Digər Popen sənədlərini anlamaq oxucu üçün bir məşq kimi qalacaq.

24
18 окт. Aaron Hall'a cavab Oct. 18. 2017-10-18 19:37 '17 də 7:37 pm 2017-10-18 19:37

İstifadə edin:

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

os - bu modul əməliyyat sisteminə xüsusi funksiyadan istifadə etmək üçün portativ bir yol təqdim edir.

Для более os функций здесь является документация.

23
ответ дан Priyankara 29 июня '15 в 14:34 2015-06-29 14:34

Это может быть так просто:

 import os cmd = "your command" os.system(cmd) 
22
ответ дан Samadi Salahedine 30 апр. '18 в 16:47 2018-04-30 16:47

subprocess.check_call удобно, если вы не хотите проверять возвращаемые значения. Он генерирует исключение при любой ошибке.

19
18 янв. Cavab verilir cdunn2001 18 yanvar. '11 в 22:21 2011-01-18 22:21

Я обычно использую subprocess вместе с shlex (для обработки экранирования цитируемых строк):

 >>> 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) 
18
ответ дан Emil Stenström 30 апр. '14 в 17:37 2014-04-30 17:37

Здесь есть еще одна разница, которая не упоминается ранее.

subprocess.Popen выполняет <command> как подпроцесс. В моем случае мне нужно выполнить файл <a>, который должен связываться с другой программой, <b>.

Я попробовал подпроцесс, и выполнение было успешным. Однако <b> не удалось связаться с <a>. Все нормально, когда я запускаю оба терминала.

Еще одно: (ПРИМЕЧАНИЕ: kwrite ведет себя отличным от других приложений. Если вы попробуете приведенный ниже с Firefox, результаты будут не такими.)

Если вы попробуете os.system("kwrite") , программный поток зависает, пока пользователь не закроет kwrite. Чтобы преодолеть это, я попробовал вместо os.system(konsole -e kwrite) . Эта программа продолжилась, но kwrite стал подпроцессом консоли.

Кто-нибудь запускает kwrite, не являющийся подпроцессом (т.е. в системном мониторе он должен появляться на крайнем левом краю дерева).

17
ответ дан Atinc Delican 09 янв. '10 в 0:11 2010-01-09 00:11

os.system не позволяет сохранять результаты, поэтому, если вы хотите сохранить результаты в каком-то списке или что-то subprocess.call работает.

17
ответ дан Saurabh Bangad 12 июня '12 в 1:28 2012-06-12 01:28

Мне очень нравится shell_command для его простоты. Он построен поверх модуля подпроцесса.

Вот пример из документов:

 >>> 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 
16
ответ дан mdwhatcott 13 авг. '12 в 21:36 2012-08-13 21:36

использовать модуль os

 import os os.system("your command") 

məsələn

 import os os.system("ifconfig") 
14
ответ дан abhi krishnan 27 июля '18 в 11:10 2018-07-27 11:10

В Linux, если вы хотите вызвать внешнюю команду, которая будет выполняться независимо (будет работать после завершения python script), вы можете использовать простую очередь как диспетчер задач или at команда

Пример с диспетчером очереди задач:

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

Заметки о диспетчере очереди задач ( ts ):

  • Вы можете установить количество одновременных процессов, которые будут выполняться ( "слоты" ) с помощью:

    ts -S <number-of-slots>

  • Установка ts не требует прав администратора. Вы можете загрузить и скомпилировать его из источника с помощью простого make , добавить его в свой путь, и все готово.

14
ответ дан Yuval Atzmon 27 нояб. '16 в 3:15 2016-11-27 03:15

Бесстыдный плагин, я написал для этого библиотеку: P https://github.com/houqp/shell.py

В настоящее время это оболочка для popen и shlex. Он также поддерживает команды конвейеров, чтобы упростить цепочку команд в Python. Таким образом, вы можете делать такие вещи, как:

 ex('echo hello shell.py') | "awk '{print $2}'" 
14
ответ дан houqp 01 мая '14 в 23:49 2014-05-01 23:49

Вы можете использовать Popen, а затем вы можете проверить статус процедуры:

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

Проверьте подпроцесс .

13
ответ дан admire 16 июля '12 в 18:16 2012-07-16 18:16
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос