2013-02-12 30 views
25

subprocess.Popen aramasını kullanıyorum ve başka bir soruda Python'un komut satırı için nasıl argümanlar ürettiğini yanlış anladığımı öğrendim., alt işlem tarafından çağrılan komut satırını mı çıktı?

Benim Soru
fiili komut satırı ne olduğunu bulmak için bir yol var mı?

Örnek Kod: -

proc = subprocess.popen(....) 
print "the commandline is %s" % proc.getCommandLine() 

nasıl getCommandLine yazardınız?

cevap

41

Kullandığınız Python sürümüne bağlıdır. In Python3.3, arg proc.args kaydedilir: Python2.7, the args not saved yılında

proc = subprocess.Popen(....) 
print("the commandline is {}".format(proc.args)) 

, sadece _execute_child gibi diğer işlevlere geçer. Yani, bu durumda, komut satırı almanın en iyi yolu ona sahip olduğunda kaydetmek için geçerli:

proc = subprocess.Popen(shlex.split(cmd)) 
print "the commandline is %s" % cmd 

dikkat edin, eğer böyle türü gibi (bağımsız değişkenlerin listesi varsa

In [14]: import subprocess 

In [15]: import shlex 

In [16]: cmd = 'foo -a -b --bar baz' 

In [17]: shlex.split(cmd) 
Out[17]: ['foo', '-a', '-b', '--bar', 'baz'] 

In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz']) 
Out[19]: 'foo -a -b --bar baz' 
+0

2.6 yaşındayım. Ve 2.6'da en azından, list2cmdline'ın belgelenmemiş olması iyi, çünkü işe yaramıyor: '--arg = foo çubuğu' için python ACTUALLY ne yapıyor? '--arg = "foo bar"' ama list2cmdline ne veriyor? ' --arg = foo bar "'... ama teşekkürler. –

+0

Bence problem, "list2cmdline" ile değil, "shlex.split" ile var. shlex.split ('- arg = "foo çubuğu"') 'tek bir öğeyle bir liste döndürür:' ['--arg = foo bar'] ', shlex.split ('- arg =") foo bar "')' argümanları doğru bir şekilde ayırır: '[' --arg ',' = ',' foo bar ']'. Bu ikinci listede 'list2cmdline' iyi çalışıyor. – unutbu

+0

Bu arada, Python2.6'nın 'subprocess' modülü 'args' bir dizge olmadığında' args'ı bir listeye dönüştürmek için 'list2cmdline''nı kullanır, böylece' 'dönüş değeri olarak gördüklerinize göre çalışır. list2cmdline (args) '' execvp * 'ya da Windows eşdeğerine aktarılmakta olan şeydir. – unutbu

2

Sorumun doğru yanıt aslında orada geçerli: shlex.split(cmd) tarafından döndürülen şey, o zaman belgesiz işlevini subprocess.list2cmdline kullanarak komut satırı dizesi, cmd kurtarabilirsiniz IS komut satırı yok. Alt işlemlerin noktası, IPC aracılığıyla herşeyi yapmasıdır. List2cmdline beklendiği kadar yakındır, ancak gerçekte yapılacak en iyi şey "args" listesine bakmaktır ve sadece bunun çağrılan programda argv olacağını bilir.

+2

['list2cmdline()'] (https: // hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541) yalnızca MS C çalışma zamanının komut satırını nasıl ayrıştırdığı ile uyumlu uygulamalar için yararlıdır. Bir argüman listesi 'CreateProcess() 'öğesine iletilen bir dizeye dönüştürür. ['cmd.exe 'farklı kurallar kullanır] (http://stackoverflow.com/q/27864103/4279). POSIX'te liste doğrudan os.execve() 'ye (+/- os.fsencode()) aktarılır. – jfs

İlgili konular