উইন্ডোজ সাব-প্রসেস.সকল () এ ফাইলটি খুঁজে পাচ্ছে না


104

আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

WindowsError: [Error 2] The system cannot find the file specified

আমার কোডটি হ'ল:

subprocess.call(["<<executable file found in PATH>>"])

উইন্ডোজ 7, ​​64 বিট। পাইথন 3.x সর্বশেষ, স্থিতিশীল।

কোন ধারনা?

ধন্যবাদ,


এবং এই নির্বাহযোগ্য ফাইল কি?
সাইলেন্টগোস্ট

অ্যান্ড্রয়েড এসডিকে "অ্যান্ড্রয়েড" এক্সিকিউটেবল অংশ
শ্রী

4
এবং হয় পথে প্রাপ্তিসাধ্য
শ্রীলঙ্কা

আপনি এটি কমান্ড লাইন থেকে চালাতে পারেন?
সাইলেন্টগোস্ট

আমি কী সম্পাদনের চেষ্টা করছি তার একটি সামান্য ব্যাকগ্রাউন্ড। এটি ওপেনডেভাইসের জন্য - এইচটিএমএল 5 অ্যাপ্লিকেশনগুলিকে ডিভাইস নির্দিষ্ট অ্যাপ্লিকেশনগুলিতে রূপান্তর করতে একটি মুক্ত উত্স প্রকল্প। আমি os.system () প্রতিস্থাপন করার চেষ্টা করছি bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/... subprocess.call করার ()
শ্রীলঙ্কা

উত্তর:


180

কমান্ডটি শেল অন্তর্নির্মিত হলে, কলটিতে একটি 'শেল = ট্রু' যুক্ত করুন।

যেমন dirআপনার টাইপ করতে হবে:

import subprocess
subprocess.call('dir', shell=True)

ডকুমেন্টেশন থেকে উদ্ধৃতি:

উইন্ডোজে আপনাকে কেবল শেল = নির্দিষ্ট করতে হবে যখন আপনি চালাতে চান সেই আদেশটি শেলের মধ্যে নির্মিত হয় (যেমন দির বা অনুলিপি)। ব্যাচ ফাইল বা কনসোল-ভিত্তিক এক্সিকিউটেবল চালনার জন্য আপনার শেল = ট্রু দরকার নেই।


14
কারণ এটি * নিক্সে dir.exeথাকা অবস্থায় কোনও এক্সিকিউটেবল বলা হয়নি /bin/lsdirদ্বারা বাস্তবায়িত হয় cmd.exe অনেক মত cdদ্বারা বাস্তবায়িত হয় ব্যাশ
অপালালা

4
এটি দৃ strongly়ভাবে নিরুৎসাহিত হয়। docs.python.org/2/library/…
নিউ

11
@ নিউভারেস্ট কেবল তখনই যখন কমান্ড স্ট্রিংটি বাহ্যিক ইনপুট থেকে নির্মিত হয়
জিরকা

বিকল্পটি (বাহ্যিক ইনপুটটির জন্য আরও সুরক্ষিত) হ'ল এটি PATHথেকে নেওয়া os.environএবং নিজে এটি অনুসন্ধান করা।
asmeurer

এই সমস্যার অনেক বেশি উপযুক্ত সমাধানের জন্য stackoverflow.com/a/32799942/3912576 দেখুন ।
সাইমনব্যাগস

35

উইন্ডোজ, আমি বিশ্বাস করি subprocess মডিউলটি PATHআপনি পাস না করা পর্যন্ত না দেখায়shell=True কারণ এটি CreateProcess()পর্দার আড়ালে ব্যবহার করে। তবে, shell=Trueযদি আপনি আপনার প্রোগ্রামের বাইরে থেকে আসতে পারে এমন যুক্তিগুলি পাস করেন তবে এটি সুরক্ষা ঝুঁকিপূর্ণ হতে পারে। করতে subprocessতা সত্ত্বেও সঠিক এক্সিকিউটেবল খুঁজে পেতে সক্ষম, আপনি ব্যবহার করতে পারেন shutil.which। ধরুন আপনার মধ্যে এক্সিকিউটেবলের PATHনাম দেওয়া হয়েছে frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(এটি পাইথন ৩.৩ এবং তার উপরে কাজ করে))


4
কোন পাইথন 2 অপশন?
নর্মসিম

4
আপনি ঠিক বলেছেন এবং আপনি এটি ঠিক করার সঠিক উপায়ের পরামর্শ দিচ্ছেন। এই উত্তর গ্রহণ করা উচিত। বর্তমানে গৃহীত উত্তরটি কারণ ব্যাখ্যা করে না এবং এটি একটি সমাধানের পরামর্শ দিচ্ছে যা কিছু ক্ষেত্রে বিপজ্জনক হতে পারে।
ডেভিড ফেরেঞ্জি রোগোয়ান

18

উইন্ডোজে আপনাকে cmd.exe মাধ্যমে কল করতে হবে। অপালালার যেমন উল্লেখ করা হয়েছে, উইন্ডোজ কমান্ডগুলি পৃথক এক্সিকিউটেবল হিসাবে নয়, সেমিডেমিতে প্রয়োগ করা হয়।

যেমন

subprocess.call(['cmd', '/c', 'dir'])

/ সি সেমিডিকে ফলো কমান্ড চালাতে বলে

এটি শেল = ট্রু ব্যবহারের চেয়ে নিরাপদ, যা শেল ইনজেকশনের অনুমতি দেয়।


আমি কীভাবে পর্দা খোলা রাখব?
মুন্দ্রা

4
@ মুন্ড্রা, আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে /kপরিবর্তে চেষ্টা করুন /ccmd /?বিস্তারিত জানার জন্য কমান্ড লাইনে প্রবেশ করুন।
ব্যবহারকারী5910

@ ব্যবহারকারী5910 আপনাকে ধন্যবাদ। আমি সুযোগ পেলে একবার চেষ্টা করে দেখব।
মুন্দ্রা

3

আপনি যদি পাওয়ারশেল ব্যবহার করে থাকেন তবে তা এতে থাকবে subprocess.call(['powershell','-command','dir'])। পাওয়ারশেল POSIX কমান্ডের একটি বড় অংশ সমর্থন করে


2

অনেক মাথা চুলকানোর পরে, আমি আবিষ্কার করেছি যে সি: \ উইন্ডোজ \ সিস্টেম 32 a তে অবস্থিত একটি ফাইল চালানো যখন একটি bit৪ বিট মেশিনে পাইথনের 32 বিট সংস্করণটি চালানো একটি সম্ভাব্য সমস্যা, কারণ উইন্ডোজ প্রক্রিয়াটি আউট-স্মার্ট করার চেষ্টা করেছিল, এবং সি: \ উইন্ডোজ \ সিস্টেম 32 তে সি: \ উইন্ডোজ ys সিএসডাব্লু 64৪64 এ কল পুনর্নির্দেশ করুন।

আমি এখানে এটি ঠিক করার জন্য একটি উদাহরণ পেয়েছি: http://code.activestate.com/recips/578035-disable-file-system-redirector/


1

ডকুমেন্টেশন থেকে উদ্ধৃতি:

"পাইথন ৩.৫ এর পূর্বে এই তিনটি ফাংশনটিতে উচ্চ-স্তরের এপিআই সাব-প্রসেসিতে অন্তর্ভুক্ত ছিল You আপনি এখন অনেক ক্ষেত্রে রান () ব্যবহার করতে পারেন তবে প্রচুর বিদ্যমান কোড এই ফাংশনগুলিকে কল করে" "

এসও: সাবপ্রসেসের পরিবর্তে সবকটি পাইথন 3.5 এবং তারপরের জন্য সাবপ্রসেস.আরুন ব্যবহার করুন


সত্য এবং সহায়ক।
এরিক জি। হ্যাগ্রস্টোম

0

আমি পিএইচপি কল করার সময় আমি একই সমস্যাটি পূরণ করেছি। কারণ হ'ল পিএইচপি PATH তে নেই তাই পিএইচপি কমান্ডটি খুঁজে পাওয়া যায় নি। তবে পাওয়ারশেলটি সনাক্ত করেছে যে এটি বর্তমান অবস্থানে রয়েছে এবং এটি 'পিএইচপি' এর পরিবর্তে 'পিএইচপি' প্রতিস্থাপনের পরামর্শ দেয় যদি আমি এই আদেশটি বিশ্বাস করি তবে। পিএইচপি '। তারপরে এটি ভাল চলে runs

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.