আমি নিম্নলিখিত ত্রুটি পাচ্ছি:
WindowsError: [Error 2] The system cannot find the file specified
আমার কোডটি হ'ল:
subprocess.call(["<<executable file found in PATH>>"])
উইন্ডোজ 7, 64 বিট। পাইথন 3.x সর্বশেষ, স্থিতিশীল।
কোন ধারনা?
ধন্যবাদ,
আমি নিম্নলিখিত ত্রুটি পাচ্ছি:
WindowsError: [Error 2] The system cannot find the file specified
আমার কোডটি হ'ল:
subprocess.call(["<<executable file found in PATH>>"])
উইন্ডোজ 7, 64 বিট। পাইথন 3.x সর্বশেষ, স্থিতিশীল।
কোন ধারনা?
ধন্যবাদ,
উত্তর:
কমান্ডটি শেল অন্তর্নির্মিত হলে, কলটিতে একটি 'শেল = ট্রু' যুক্ত করুন।
যেমন dir
আপনার টাইপ করতে হবে:
import subprocess
subprocess.call('dir', shell=True)
ডকুমেন্টেশন থেকে উদ্ধৃতি:
উইন্ডোজে আপনাকে কেবল শেল = নির্দিষ্ট করতে হবে যখন আপনি চালাতে চান সেই আদেশটি শেলের মধ্যে নির্মিত হয় (যেমন দির বা অনুলিপি)। ব্যাচ ফাইল বা কনসোল-ভিত্তিক এক্সিকিউটেবল চালনার জন্য আপনার শেল = ট্রু দরকার নেই।
dir.exe
থাকা অবস্থায় কোনও এক্সিকিউটেবল বলা হয়নি /bin/ls
। dir
দ্বারা বাস্তবায়িত হয় cmd.exe অনেক মত cd
দ্বারা বাস্তবায়িত হয় ব্যাশ ।
PATH
থেকে নেওয়া os.environ
এবং নিজে এটি অনুসন্ধান করা।
উইন্ডোজ, আমি বিশ্বাস করি subprocess
মডিউলটি PATH
আপনি পাস না করা পর্যন্ত না দেখায়shell=True
কারণ এটি CreateProcess()
পর্দার আড়ালে ব্যবহার করে। তবে, shell=True
যদি আপনি আপনার প্রোগ্রামের বাইরে থেকে আসতে পারে এমন যুক্তিগুলি পাস করেন তবে এটি সুরক্ষা ঝুঁকিপূর্ণ হতে পারে। করতে subprocess
তা সত্ত্বেও সঠিক এক্সিকিউটেবল খুঁজে পেতে সক্ষম, আপনি ব্যবহার করতে পারেন shutil.which
। ধরুন আপনার মধ্যে এক্সিকিউটেবলের PATH
নাম দেওয়া হয়েছে frob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(এটি পাইথন ৩.৩ এবং তার উপরে কাজ করে))
উইন্ডোজে আপনাকে cmd.exe মাধ্যমে কল করতে হবে। অপালালার যেমন উল্লেখ করা হয়েছে, উইন্ডোজ কমান্ডগুলি পৃথক এক্সিকিউটেবল হিসাবে নয়, সেমিডেমিতে প্রয়োগ করা হয়।
যেমন
subprocess.call(['cmd', '/c', 'dir'])
/ সি সেমিডিকে ফলো কমান্ড চালাতে বলে
এটি শেল = ট্রু ব্যবহারের চেয়ে নিরাপদ, যা শেল ইনজেকশনের অনুমতি দেয়।
/k
পরিবর্তে চেষ্টা করুন /c
। cmd /?
বিস্তারিত জানার জন্য কমান্ড লাইনে প্রবেশ করুন।
আপনি যদি পাওয়ারশেল ব্যবহার করে থাকেন তবে তা এতে থাকবে subprocess.call(['powershell','-command','dir'])
। পাওয়ারশেল POSIX কমান্ডের একটি বড় অংশ সমর্থন করে
অনেক মাথা চুলকানোর পরে, আমি আবিষ্কার করেছি যে সি: \ উইন্ডোজ \ সিস্টেম 32 a তে অবস্থিত একটি ফাইল চালানো যখন একটি bit৪ বিট মেশিনে পাইথনের 32 বিট সংস্করণটি চালানো একটি সম্ভাব্য সমস্যা, কারণ উইন্ডোজ প্রক্রিয়াটি আউট-স্মার্ট করার চেষ্টা করেছিল, এবং সি: \ উইন্ডোজ \ সিস্টেম 32 তে সি: \ উইন্ডোজ ys সিএসডাব্লু 64৪64 এ কল পুনর্নির্দেশ করুন।
আমি এখানে এটি ঠিক করার জন্য একটি উদাহরণ পেয়েছি: http://code.activestate.com/recips/578035-disable-file-system-redirector/
ডকুমেন্টেশন থেকে উদ্ধৃতি:
"পাইথন ৩.৫ এর পূর্বে এই তিনটি ফাংশনটিতে উচ্চ-স্তরের এপিআই সাব-প্রসেসিতে অন্তর্ভুক্ত ছিল You আপনি এখন অনেক ক্ষেত্রে রান () ব্যবহার করতে পারেন তবে প্রচুর বিদ্যমান কোড এই ফাংশনগুলিকে কল করে" "
এসও: সাবপ্রসেসের পরিবর্তে সবকটি পাইথন 3.5 এবং তারপরের জন্য সাবপ্রসেস.আরুন ব্যবহার করুন
আমি পিএইচপি কল করার সময় আমি একই সমস্যাটি পূরণ করেছি। কারণ হ'ল পিএইচপি PATH তে নেই তাই পিএইচপি কমান্ডটি খুঁজে পাওয়া যায় নি। তবে পাওয়ারশেলটি সনাক্ত করেছে যে এটি বর্তমান অবস্থানে রয়েছে এবং এটি 'পিএইচপি' এর পরিবর্তে 'পিএইচপি' প্রতিস্থাপনের পরামর্শ দেয় যদি আমি এই আদেশটি বিশ্বাস করি তবে। পিএইচপি '। তারপরে এটি ভাল চলে runs