2009-06-26 17 views
6

Güncelleme: yerine subprocess.Popen ait subprocess.call, sorun çözüldü ı kullandığınızda - Herkes neden ne biliyor? Ve başka bir problem geldi: Çıkışı kontrol etmenin bir yolunu bulamıyorum ... Çıktının subprocess.call'dan bir dizgeye veya benzeri bir şeye yönlendirilmesi için bir yol var mı? Teşekkürler! Ama bir piton kullandığınızda cmd Yukarıdaki aynı hat olduğu Popen(cmd,shell=true) kullanarak çalıştırmak için -Ben yapılandırmak ile Devenv çalıştırmak için bir python komut yazarken "Debug | Win32" Bu yaptığı hiçbir şey

Ben projeler inşa etmek için Devenv kullanmaya çalışıyorum ve ben devenv A.sln /build "Debug|Win32" gibi komut istemine bunu yazarken sadece iyi çalışır hiçbir şey göstermiyor. |'u kaldırırsam, yalnızca "Debug" olarak değiştirirse, çalışır ...

Bunun neden olduğunu bilen var mı? Ben \ önce | koyarak denedim ama yine de hiçbir şey olmadı .. Bu kullanıyorum kodudur

:

from subprocess import Popen, PIPE 

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" ' 

sys.stdout.flush() 
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE) 
lines = [] 
for line in p.stdout.readlines(): 
    lines.append(line) 
out = string.join(lines) 
print out 
if out.strip(): 
    print out.strip('\n') 
    sys.stdout.flush() 

Ben Debug|Win32 değiştiriyorsanız, ancak çalışmıyor hangi ... |

'devenv A.sln/yapı "Win32 Debug"': Debug ile, bu
+0

Kafamı attıran sadece bir önseziniz hangi kullandıysanız/içe aktarma ifadesini gösterebilir misiniz? –

+0

Tabii, bu kadar: altişlem ithalat POPEN, BORU p = POPEN (cmd, kabuk = Doğru, stdout'u = BORU stderr = BORU) cmd 'gibi bir şeydir ".. (yol)/devenv" çözüm dan/"Debug | Win32" oluştur ... gibi görünüyor | işareti tüm komutun göz ardı edilmesini sağlar ... –

+0

'devenv.com' komutunun tamamını içeren Python'da anında bir compile.bat dosyası yaratıldığını ve sonra 'Popen' işlevini kullanan bir compytite.bat'ın bir çekicilik gibi çalıştığını öğrendim. –

cevap

0

/liste olarak arugments .. gibi bir şey:

from subprocess import Popen, PIPE 

cmd = [ 
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes 
    "solution.sln", 
    "/build", 
    "Debug|Win32" 
] 

p = Popen(cmd, stdout=PIPE, stderr=PIPE) 
out = p.stdout.read() # reads full output into string, including line breaks 

print out 
+0

Aslında argümanların listesi benim için işe yaramıyor - ben onu çalıştırdığımda, sadece ilk argümanın çağrılması gerektiği anlamına gelen devenv'in yardım diyaloğunu gösteriyor. Ancak, kabuk bağımsız değişkeni ile doğru anlamışsınız - kabuğunu devre dışı bıraktığımda ortaya çıktı = Doğru, orijinal komut satırı mükemmel çalışıyor. Için farklı anlamlar olmalı. Kabuk seçeneği ile sanırım. Teşekkürler ve şerefe! –

0

çift gibi alıntı deneyin

burada her yorum için .. mükemmel

Teşekkür işleri

+0

Aslında çift tırnak işareti yaptım .. –

0

Windows 'kabuğu, |'u bir boru olarak alıyor (tırnak ve çıkışlara rağmen). Bunun yerine shell=False denediniz mi?

shell = False kullanıldığında komutunu geçmesi gerekiyor bu yüzden, bu tek komut olarak dize görür
+0

Kabuğu False olarak ayarladığımda, herhangi bir çıktı elde edemiyorum, bu yüzden çalışıp çalışmadığından emin olamıyorum. Kabuk = False olduğunda nasıl çıktı alacağımı söyleyebilir misin? Teşekkürler –

+0

Bu bir gizem - lütfen bize kodun tüm parçacığını göster, aksi takdirde hiç şüphesiz kalacak bir ;-). –

+0

Soruna neden olan kabuk seçeneği olduğu ortaya çıktı. Çıkışı ilk başta almadığımı bilmiyorum. Teşekkürler!! –

4

devenv.exe arasında bir fark yoktur devenv.com, her ikisi de çalıştırılabilir ve aynı dizinde (iç) yaşar. Soruda kullanılan komut satırları ve bazı cevaplar istediklerini söylemiyor, bu yüzden hangisinin kullanılacağından emin değilim.

Komut satırından aramak istediğinizde, devenv.com kullandığınızdan emin olmanız gerekir, aksi halde bir GUI çıktısını almanız olasıdır. Sanırım bu, karışıklığın bazılarının (ama hepsinin değil) sebebi olabilir.

+2

bu benim için çalıştı. Yukarıdaki 'devenv' öğesini 'devenv.com' olarak değiştirdim ve her şey çalışmaya başladı. – gman

1

Bkz. Bölüm 17.1.5.1. python belgelerinde.

Windows'da Python, proje yapılandırma argümanı etrafındaki çift tırnakları otomatik olarak ekler, örn. Debug | win32, devenv için "Debug | win32" olarak iletilir. Çift tırnak eklemek gerekmez ve kabuk = True to Popen geçmek gerekmez.

Devenv'e iletilen argüman dizesini görüntülemek için ProcMon'u kullanın.

İlgili konular