OSError: [Errno 2] Django में अजगर उपप्रकार का उपयोग करते समय ऐसी कोई फ़ाइल या निर्देशिका नहीं है


137

मैं पायथन कोड के अंदर कुछ सिस्टम कॉल करने के लिए एक प्रोग्राम चलाने की कोशिश कर रहा हूं subprocess.call()जिसमें निम्न त्रुटि फेंकता है:

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

मेरा वास्तविक पायथन कोड इस प्रकार है:

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)

क्या मुझे इसे हल करने के बारे में कुछ प्रासंगिक सलाह मिल सकती है?


इस प्रश्न का दोहराव करने वाले प्रश्न का बेहतर उत्तर है। उस सवाल को फिर से खोला जाना चाहिए और इसके बजाय इसकी नकल की गई।
user3553031

जवाबों:


301

shell=Trueयदि आप स्ट्रिंग को पास कर रहे हैं तो उपयोग करें subprocess.call

से डॉक्स :

यदि किसी एकल स्ट्रिंग shellको पास किया जा रहा है , तो या तो होना चाहिए Trueया फिर स्ट्रिंग को किसी भी तर्क को निर्दिष्ट किए बिना प्रोग्राम को निष्पादित करने के लिए नाम देना चाहिए।

subprocess.call(crop, shell=True)

या:

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

7
पाइथन 3 एक बेहतर त्रुटि संदेश देता है, जो अपमानजनक 'फ़ाइल' का नाम देता है, लेकिन यह कोई संकेत नहीं देता है कि शेल = ट्रू की आवश्यकता है। धन्यवाद!
ऐनीएजाइल

14
ध्यान रखें, डॉक्स भी राज्य "का उपयोग shell=Trueकर रहा है बिल्कुल अनुशंसित जहां कमांड स्ट्रिंग बाहरी इनपुट से निर्माण किया है मामलों में", लिंक जवाब में देखते हैं।
मान्य

23
@AnneTheAgile: shell=Trueआवश्यक नहीं है। इसके अलावा आपको इसका उपयोग नहीं करना चाहिए जब तक कि यह आवश्यक न हो (देखें @ वैध की टिप्पणी)। आपको प्रत्येक कमांड-लाइन तर्क को एक अलग सूची आइटम के रूप में पारित करना चाहिए जैसे कि, ['command', 'arg 1', 'arg 2']इसके बजाय का उपयोग करें "command 'arg 1' 'arg 2'"
JFS

3
@ user3553031 मैं अन्य प्रारूपों पर इसकी सिफारिश नहीं कर रहा हूं। मैंने केवल इस तथ्य को इंगित किया है कि यदि आप एक स्ट्रिंग का उपयोग कर रहे हैं तो आपको उपयोग करना होगा shell=True। सुरक्षा प्रश्न इस प्रश्न के दायरे से बाहर हैं।
अश्विनी चौधरी

6
@ user3553031 यह हमेशा हतोत्साहित नहीं करता है, दस्तावेज़ स्पष्ट रूप से कहता है कि जब इनपुट बाहरी इनपुट से आ रहा है तो यह सुरक्षित नहीं है । यह कहना कि आपको इसका उपयोग कभी भी बकवास नहीं करना चाहिए। और उपप्रकार के बारे में बहुत सारे प्रश्न हैं, इसका हर उत्तर में उल्लेख करने का कोई मतलब नहीं है। अन्य उपयोगकर्ताओं से इसके बारे में पहले से ही टिप्पणियां हैं और मैंने प्रलेखन के लिए लिंक भी साझा किया है। मेरा उत्तर संपादित करने के लिए आपका स्वागत है।
अश्विनी चौधरी

5

उत्थान नहीं कर सकता, इसलिए मैं @jfs टिप्पणी को पुन: लिख दूंगा क्योंकि मुझे लगता है कि यह अधिक दृश्यमान होना चाहिए।

@AnneTheAgile: शेल = ट्रू की आवश्यकता नहीं है। इसके अलावा आपको इसका उपयोग नहीं करना चाहिए जब तक कि यह आवश्यक न हो (देखें @ वैध की टिप्पणी)। आपको प्रत्येक कमांड-लाइन तर्क को एक अलग सूची आइटम के रूप में पास करना चाहिए जैसे कि, उदाहरण के लिए, "कमांड 'arg 1' 'arg 2' के बजाय [, कमांड’, each arg 1 ’,] arg 2’] का उपयोग करें। - मार्च 3 '15 को 10:02 बजे


2

No such file or directoryअगर आप Popenडबल-कोट्स के साथ फ़ाइल तर्क रखने की कोशिश कर रहे हैं तो भी उठाया जा सकता है ।

उदाहरण के लिए:

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

इस मामले में, आपको डबल-कोट्स को हटाने की आवश्यकता है।

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.