SORU
21 Ocak 2011, Cuma


Python shell komutu çalıştırma ve çıkış yakalama

Bir kabuk komutunu yürütün ve çıktısını döndüren bir fonksiyon yazmak istiyorumbir dize gibiolursa olsun, hata veya başarı mesajı. Ben sadece komut satırı ile alırdım aynı sonucu almak istiyorum.

Böyle bir şey yapacak bir kod örneği ne olabilir?

Örneğin:

def run_command(cmd):
    # ??????

print run_command('mysqladmin create test -uroot -pmysqladmin12')
# Should output something like:
# mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'test'; database exists'

CEVAP
21 Ocak 2011, Cuma


Kolaylık sağlamak için, Python 2.7 sağlar

subprocess.check_output(*popenargs, **kwargs)  

Popen aynı argüman alan fonksiyon, ama bir dize programın çıktısını döndürür. stderr=subprocess.STDOUT hata iletileri iade çıkış -- dahil olmasını sağlamak için geçebilir ama check_output stderr=subprocess.PIPE geçemiyor. deadlocks neden olabilir. Eğer ihtiyacınız varsa stderr, boru aşağıda Popen örneğe bakın.

Eğer eski bir python kullanıyorsanız, Vartec's yöntem işe yarar. Ama gerçek zamanlı çıkış -- yakalama gerekmez. en azından basit durumlarda gitmek için daha iyi bir yolu communicate kullanmaktır. Gibi:

output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]

Ya

>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, 
...                                    stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo

stdin=PIPE, communicate stdin) işlemi için veri geçmesine izin verir ayarlarsanız:

>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
...                           stderr=subprocess.PIPE,
...                           stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo

Son olarak, not Aaron Hall's answer, hangi gösteren bazı sistemlerde, gerekebilir set stdout, stderr stdin PIPE (ya da DEVNULL) communicate iş.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • PomplamooseMusic

    PomplamooseM

    28 HAZİRAN 2008
  • RickardRick

    RickardRick

    9 Mart 2007