OSError: [Errno 2] Django'da python alt işlemini kullanırken böyle bir dosya veya dizin yok


137

subprocess.call()Aşağıdaki hata atıyor kullanarak Python kodu içinde bazı sistem çağrıları yapmak için bir program çalıştırmaya çalışıyorum :

Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/usr/lib/python2.7/subprocess.py", line 493, in call
      return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
      raise child_exception
      OSError: [Errno 2] No such file or directory

Gerçek Python kodum aşağıdaki gibidir:

url = "/media/videos/3cf02324-43e5-4996-bbdf-6377df448ae4.mp4"
real_path = "/home/chanceapp/webapps/chanceapp/chanceapp"+url
fake_crop_path = "/home/chanceapp/webapps/chanceapp/chanceapp/fake1"+url
fake_rotate_path = "/home/chanceapp/webapps/chanceapp.chanceapp/fake2"+url
crop = "ffmpeg -i %s -vf "%(real_path)+"crop=400:400:0:0 "+ "-strict -2 %s"%(fake_crop_path)
rotate = "ffmpeg -i %s -vf "%(fake_crop_path)+"transpose=1 "+"%s"%(fake_rotate_path)
move_rotated = "mv"+" %s"%(fake_rotate_path)+" %s"%(real_path)
delete_cropped = "rm "+"%s"%(fake_crop_path)
#system calls:
subprocess.call(crop)

Bunu nasıl çözeceğime dair bir tavsiye alabilir miyim?


Bu soruya kopyalanan sorunun çok daha iyi bir cevabı var. Bu soru yeniden açılmalı ve bunun yerine bu soru tekrarlanmalıdır.
user3553031

Yanıtlar:


301

shell=TrueBir dize geçiriyorsanız kullanın subprocess.call.

Gönderen docs :

Tek bir dize geçiriliyorsa, ya shellolmalıdır Trueya da dize herhangi bir argüman belirtmeden yürütülecek programı adlandırmalıdır.

subprocess.call(crop, shell=True)

veya:

import shlex
subprocess.call(shlex.split(crop))

7
Python 3, rahatsız edici 'dosyayı' adlandırarak daha iyi bir hata mesajı verir, ancak shell = True'nun gerekli olduğuna dair bir ipucu vermez. Teşekkür ederim!
AnneTheAgile

14
Dokümanlar ayrıca " komut dizesinin harici girişten oluşturulduğu durumlarda kullanımı kesinlikle önerilmez " ifadesini de belirtir shell=True, yanıttaki bağlantıya bakın.
geçerli

23
@AnneTheAgile: shell=Truegerekli değildir. Ayrıca, gerekli olmadıkça kullanmamalısınız (bkz. @ Valid'in yorumu). Her komut satırı bağımsız değişkenini ayrı bir liste öğesi olarak iletmelisiniz, örneğin, ['command', 'arg 1', 'arg 2']yerine kullanın "command 'arg 1' 'arg 2'".
jfs

3
@ user3553031 Ben diğer biçimler üzerinde tavsiye etmiyorum. Ben sadece bir dize kullanıyorsanız o zaman kullanmak zorunda olacağına dikkat çekti shell=True. Güvenlik hususları bu sorunun kapsamı dışındadır.
Ashwini Chaudhary

6
@ user3553031 Her zaman önerilmez, belgeler giriş harici bir girişten geldiğinde güvenli olmadığını açıkça belirtir . Hiç kullanmamanız gerektiğini söylemek saçmadır. Ve alt süreç hakkında çok fazla soru var, her cevapta bundan bahsetmek hiç mantıklı değil. Bu konuda diğer kullanıcılardan zaten yorumlar var ve belgelerin bağlantısını da paylaştım. Cevabımı düzenleyebilirsin.
Ashwini Chaudhary

5

@Jfs yorumunu yeniden yayınlayacağım, çünkü daha görünür olması gerektiğini düşünüyorum.

@AnneTheAgile: shell = True gerekli değil. Ayrıca, gerekli olmadıkça kullanmamalısınız (bkz. @ Valid'in yorumu). Her komut satırı bağımsız değişkenini ayrı bir liste öğesi olarak iletmeniz gerekir; örneğin, "komut 'arg 1' 'arg 2'" yerine ['komut', 'arg 1', 'arg 2'] kullanın. - jfs 3 Mart 15, 10:02


2

No such file or directoryPopençift ​​tırnak işaretli bir dosya argümanı koymaya çalışıyorsanız da yükseltilebilir .

Örneğin:

call_args = ['mv', '"path/to/file with spaces.txt"', 'somewhere']

Bu durumda, çift tırnak işaretlerini kaldırmanız gerekir.

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']
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.