2017-01-25 34 views
5

Birden çok subprocess.call komutunu içeren bir python betiğim var. Mac üzerinde senaryo yazdım ve mükemmel çalışıyor. Sadece Windows üzerinde çalıştırmayı denedim ve bir hata ile şaşırdım.Bu Python alt işlem komutu neden sadece kabuk = Windows'ta doğru olduğunda çalışır?

ImageMagick çağırmak için aşağıdaki komutu "çıkış durumu 4" döndürür:

file1 = "D:/Temp/OCR_test/sample/images/crops/time_0011.png" 
subprocess.call(['convert', file1, '-resize', '200%', file1]) 

aşağıdaki çalışmalara komutu değiştirme:

subprocess.call(['convert', file1, '-resize', '200%', file1], shell=True) 

Özrüme shell=True kullanarak biraz dikkatli değilim belgelerdeki uyarılar.
Aynı zamanda hem Mac hem de Windows üzerinde çalışmak için komuta ihtiyacım var ve neden Windows üzerinde çalışmadığı konusunda kafam karıştı (Kontrol ettim ve komut Windows CMD'yi kullanarak çalışıyor). ( file, lat_crop1 ve croplat tanımlanan değişkenler olduğu)

İlginçtir, aşağıdaki satır komut daha önce çalışmış:

subprocess.call(['ffmpeg', '-loglevel', 'panic', '-i', file, '-vf', lat_crop1, '-n', croplat]) 

Ben this SO question okuyup shlex (tüm önerileri çalıştı, benim komuta varyasyonlar vb ...), ama yine de aynı sonucu elde ediyorum.

Herkes o shell=True olmaksızın çalışmak, böylece bu çizgiyi değiştirebilir nasıl bir fikrin var?

Ayrıca, "çıkış durumu 4" ne anlama geliyor? Googled ve çok fazla doküman okudum ama bunun hakkında hiçbir şey bulamadım.

DÜZENLEME

: cevap sağlanan bilgilere dayanarak, ben subprocess.call(['mogrify', file1, '-resize', '200%', file1]) için çalışma değildi komuta değişti ve bu Windows üzerinde Python başarıyla çalışır. Neyse ki ImageMagick, convert'a alternatif olarak mogrify sağlar.

+0

Dönüştürme komutu nedir? ImageMagick? – Blorgbeard

+0

Evet, bu ImageMagick'den bahsetmeyi unuttum. Komut satırında çalışıyor. – Bird

+0

, komut satırından 'convert 'yazabilir misiniz? –

cevap

6

ben yerine ImageMagick'in C:\Windows\System32\convert.exe (NTFS/FAT bölümü dönüştürücü) diyoruz şüpheli.

shell=True, yol imagemagic'den convert.bat veya convert.cmd senaryoyu bulduğunda, ama onsuz, yol sadece tamamen farklı bir programdır .exe dosyayı bulabilirsiniz ve hatayı 4 olsun: geçersiz parametre. convert "yanlış" bir sistem yolunda bulunur çünkü bu özel durumda

, o bir yürütülebilir bile çalışmaz. shell=False sadece sistem yollarında arar ( python subprocess Popen environment PATH?). Bu nedenle, sistem yolunda convert adlı bir programın bulunması şanssız.

deneyin açıkça .bat uzatma böyle eklemek için:

subprocess.call(['convert.bat', file1, '-resize', '200%', file1]) 

yazabilirsiniz çalıştırılacak olasılıkları olan yürütülebilir bilmek için:

where convert 

bir komut istemine.

Sizin durumunuzda (yürütülebilir), çalıştırmak istediğiniz yürütülebilir dosyanın mutlak yolunu geçirerek geçici olarak çözülebilir.

başka yolu da kopyalama/imconvert için ImageMagick convert adlandırmak olacaktır. Kendisine hangi program convert diyor ve çatışmalar beklemiyor?

Veya bu durumda

, bu

Çözümler oldukça değildir (bize içine yolculuk için bir sistem yolunda kullanılan ve nadiren convert programı) Microsoft kafa karıştırıcı bir sol olduğunu açıklayan güzel bir yorum ile, shell=True bırakmak meşru en azından bazıları var.

+2

['CreateProcess'] (https://msdn.microsoft.com/en-us/library/ms682425) her zaman sistem dizinlerini' PATH''den önce arar ve ".EXE" eklemeye çalışır. Öte yandan, cmd kabuğu, kendi 'PATH' aramasını yapar ve 'PATHEXT' içindeki uzantıları eklemeye çalışır ve sonra bulduğu dosyanın tam yoluna sahip bir şekilde 'CreateProcess' adını verir. – eryksun

+0

@eryksun: bunu şu buldu: http://stackoverflow.com/questions/5658622/python-subprocess-popen-environment-path. Senin açıklaman en iyisi. Düzenliyorum. –

+0

Diğer 'convert' programları hakkında bilmek gerçekten ilginç ve harika. "Alt işlem" komutunda tam yolun eklenmesi işe yaradı. Öneri için teşekkürler. ImageMagick modülünü 'imconvert 'olarak değiştirmek de iyi bir fikir olabilir. Böyle bir genel isim kullanacaklarının garip olduğunu kabul ediyorum. – Bird

İlgili konular