ওএসআরর: [এর্নো ২] জ্যাঙ্গোতে পাইথন সাবপ্রসেস ব্যবহার করার সময় এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই


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)

কীভাবে এটি সমাধান করবেন সে সম্পর্কে আমি কিছু প্রাসঙ্গিক পরামর্শ পেতে পারি?


এই প্রশ্নের সদৃশ যে প্রশ্নটি করা হয়েছিল তার একটি আরও ভাল উত্তর রয়েছে। এই প্রশ্নটি আবার খোলার উচিত এবং এটির পরিবর্তে এটি এটিকে সদৃশ করা উচিত।
ব্যবহারকারী 3553031

উত্তর:


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
@ অ্যানিএইজিল: shell=Trueপ্রয়োজন হয় না। তাছাড়া এটি প্রয়োজন না হলে এটি ব্যবহার করা উচিত নয় (@ বৈধ মন্তব্য দেখুন)। এর পরিবর্তে প্রতিটি কমান্ড-লাইন আর্গুমেন্টকে পৃথক তালিকা আইটেম হিসাবে পাস করা উচিত, ['command', 'arg 1', 'arg 2']পরিবর্তে ব্যবহার করুন "command 'arg 1' 'arg 2'"
jfs

3
@ ব্যবহারকারী 3553031 আমি এটি অন্যান্য ফর্ম্যাটগুলির চেয়ে সুপারিশ করছি না। আমি কেবল সত্যটি উল্লেখ করেছি যদি আপনি কোনও স্ট্রিং ব্যবহার করছেন তবে আপনাকে ব্যবহার করতে হবে shell=True। সুরক্ষা দিকগুলি এই প্রশ্নের আওতার বাইরে।
অশ্বিনী চৌধুরী চৌধুরী

6
@ ব্যবহারকারী 3553031 এটি সর্বদা নিরুৎসাহিত হয় না, ডকুমেন্টেশনে পরিষ্কারভাবে বলা হয়েছে যে কোনও ইনপুট যখন বাহ্যিক ইনপুট থেকে আসে তখন তা নিরাপদ নয় । আপনার কখনও এটি ব্যবহার করা উচিত নয় তা বোকামি। এবং সাবপ্রসেস সম্পর্কে অনেক প্রশ্ন রয়েছে, এটি প্রতিটি উত্তরে এটি উল্লেখ করার কোনও মানে হয় না। অন্যান্য ব্যবহারকারীদের সম্পর্কে এটি সম্পর্কে ইতিমধ্যে মন্তব্য রয়েছে এবং আমি ডকুমেন্টেশনের লিঙ্কটিও ভাগ করে নিয়েছি। আপনি আমার উত্তর সম্পাদনা করতে স্বাগত জানাই।
অশ্বিনী চৌধুরী চৌধুরী

5

উত্সাহ দেওয়া যাবে না তাই আমি @jfs মন্তব্যটি পুনরায় পোস্ট করব কারণ আমি মনে করি এটি আরও দৃশ্যমান হওয়া উচিত।

@ অ্যানিএইগাইল: শেল = সত্যের প্রয়োজন নেই। তাছাড়া এটি প্রয়োজন না হলে এটি ব্যবহার করা উচিত নয় (@ বৈধ মন্তব্য দেখুন)। পরিবর্তে প্রতিটি কমান্ড-লাইন আর্গুমেন্টকে পৃথক তালিকা আইটেম হিসাবে পাস করতে হবে উদাহরণস্বরূপ, "কমান্ড 'আরগ 1' 'আরগ 2'" এর পরিবর্তে ['কমান্ড', 'আরগ 1', 'আরগ 2'] ব্যবহার করুন। - jfs মার্চ 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']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.