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.