Windows dosyayı subprocess.call () üzerinde bulamıyor


103

Aşağıdaki hatayı alıyorum:

WindowsError: [Error 2] The system cannot find the file specified

Benim kodum:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7, 64 bit. Python 3.x en son, kararlı.

Herhangi bir fikir?

Teşekkürler,


ve bu çalıştırılabilir dosya nedir?
SilentGhost

Android SDK'nın "android" çalıştırılabilir parçası
Sri

2
Ve edilir ise PATH geçerli
Sri

komut satırından çalıştırabilir misin?
SilentGhost

Başarmaya çalıştığım şeyin küçük bir arka planı. Bu, HTML5 uygulamalarını cihaza özel uygulamalara dönüştürmek için açık kaynaklı bir proje olan Opendevice içindir. Ben os.system () yerine çalışıyorum bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/... () subprocess.call için
Sri

Yanıtlar:


179

Komut yerleşik bir kabuk olduğunda, çağrıya bir 'kabuk = True' ekleyin.

Örneğin dirsizin için yazmanız gerekenler:

import subprocess
subprocess.call('dir', shell=True)

Belgelerden alıntı yapmak için:

Windows'ta shell = True belirtmeniz gereken tek zaman, yürütmek istediğiniz komutun kabukta yerleşik olduğu zamandır (örn. Dir veya copy). Bir toplu iş dosyası veya konsol tabanlı yürütülebilir dosya çalıştırmak için shell = True'ya ihtiyacınız yoktur.


14
Bunun nedeni dir.exe, bir /bin/lsin * nix varken çağrılan bir yürütülebilir dosya olmamasıdır . dirtarafından uygulanan CMD.EXE çok gibi cdtarafından uygulanan bash .
Apalala

1
Bu kesinlikle önerilmez. docs.python.org/2/library/…
nu everest

11
@nueverest Yalnızca komut dizesi harici girişten oluşturulduğunda
Jirka

Alternatif (harici giriş için daha güvenli) elde etmektir PATHgelen os.environve manuel olarak aramak.
asmeurer

Bkz stackoverflow.com/a/32799942/3912576 bu soruna çok daha uygun bir çözüm.
SimonBiggs

34

Windows'ta, subprocessmodülünPATHshell=TrueCreateProcess() perde arkasında kullandığı için geçmedikçe içine bakmadığına inanıyorum . Bununla birlikte, shell=Trueprogramınızın dışından gelen argümanları iletiyorsanız bir güvenlik riski olabilir. Yapmak için subprocessdoğru yürütülebilir bulmak mümkün yine de kullanabilirsiniz shutil.which. Dosyanızdaki yürütülebilir dosyanın PATHadlandırıldığını varsayalım frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(Bu, Python 3.3 ve üzeri sürümlerde çalışır.)


4
Herhangi bir python 2 seçeneği var mı?
Naramsim

1
Haklısın ve düzeltmek için doğru yolu öneriyorsun. Bu cevap kabul edilmelidir. Şu anda kabul edilen cevap nedeni açıklamıyor ve bazı durumlarda tehlikeli olabilecek bir düzeltme öneriyor.
David Ferenczy Rogožan

18

Windows'ta cmd.exe aracılığıyla aramanız gerekir. Apalala'nın da belirttiği gibi, Windows komutları ayrı yürütülebilir dosyalar olarak değil cmd.exe'de uygulanır.

Örneğin

subprocess.call(['cmd', '/c', 'dir'])

/ c cmd'ye follow komutunu çalıştırmasını söyler

Bu, kabuk enjeksiyonlarına izin veren shell = True kullanmaktan daha güvenlidir.


Ekranı nasıl açık tutabilirim?
Moondra

2
@Moondra, eğer seni doğru anlıyorsam, /kyerine dene /c. cmd /?Ayrıntılar için komut satırına girin .
Kullanıcı5910

@ User5910 Teşekkürler. Bir şansım olduğunda deneyeceğim.
Moondra

3

Powershell kullanıyorsanız, o zaman içinde olacaktır subprocess.call(['powershell','-command','dir']). Powershell, POSIX komutlarının büyük bir bölümünü destekler


2

Çok fazla kafa karıştırdıktan sonra, 64 bitlik bir makinede 32 bitlik bir python sürümü çalıştırırken C: \ Windows \ System32 \ konumunda bulunan bir dosyayı çalıştırmanın, Windows'un süreci daha akıllı hale getirmeye çalışması nedeniyle potansiyel bir sorun olduğunu keşfettim ve çağrıları C: \ Windows \ System32'ye C: \ Windows \ SysWOW64'e yönlendirin.

Bunu nasıl düzelteceğime dair bir örnek buldum: http://code.activestate.com/recipes/578035-disable-file-system-redirector/


1

Belgelerden alıntı yapmak için:

"Python 3.5'ten önce, bu üç işlev alt işlem için üst düzey API'den oluşuyordu. Artık birçok durumda run () kullanabilirsiniz, ancak mevcut kodların çoğu bu işlevleri çağırır."

SO: subprocess.call yerine Python 3.5 ve üstü için subprocess.run kullanın


Doğru ve yardımsever.
Erick G. Hagstrom

0

Bir PHP'yi ararken aynı sorunla karşılaştım. Bunun nedeni PHP'nin PATH'de olmaması, dolayısıyla PHP komutu bulunamadı. Ancak PowerShell, mevcut konumda var olduğunu buldu ve bu komuta güveniyorsam 'PHP'yi'. \ PHP 'ile değiştirmeyi önerir. Sonra iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.