আমি কীভাবে পাইথন থেকে কোনও প্রোগ্রাম চালাব? ওএস.সিস্টেম ব্যর্থতার পথে পাথ পড়ে


273

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যার একটি বাহ্যিক প্রোগ্রাম চালানো দরকার তবে কোনও কারণে ব্যর্থ হয়।

আমার যদি নিম্নলিখিত স্ক্রিপ্ট থাকে:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

তারপরে এটি নিম্নলিখিত ত্রুটির সাথে ব্যর্থ হয়:

'সি: \ টেম্প \ এ' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।

আমি যদি উদ্ধৃতি সহ প্রোগ্রামটি থেকে পালাতে পারি:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

তারপরে এটি কাজ করে। তবে আমি যদি কোনও পরামিতি যুক্ত করি তবে এটি আবার কাজ করা বন্ধ করে দেয়:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

কোনও প্রোগ্রাম কার্যকর করার এবং এটি শেষ হওয়ার জন্য অপেক্ষা করার সঠিক উপায় কী? আমার এটি থেকে আউটপুট পড়ার দরকার নেই, কারণ এটি একটি ভিজ্যুয়াল প্রোগ্রাম যা কোনও কাজ করে এবং তারপরেই বেরিয়ে আসে, তবে এটি শেষ হওয়ার জন্য আমাকে অপেক্ষা করতে হবে।

আরও মনে রাখবেন, প্রোগ্রামটিকে একটি ফাঁকা ফাঁকা পথে নিয়ে যাওয়া কোনও বিকল্প নয়।


এটিও কাজ করে না:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

অদলবদল একক / ডাবল উদ্ধৃতি নোট করুন।

এখানে নোটপ্যাডের প্যারামিটার সহ বা ছাড়াই এটি ত্রুটি বার্তায় ব্যর্থ হয়

ফাইলের নাম, ডিরেক্টরি নাম, বা ভলিউম লেবেল বাক্য গঠন ভুল is


এটি ব্যবহার করুন: os.system(r'C:\temp\"a b c"\Notepad.exe') বা এটি:os.system('C:\\temp\\"a b c"\\Notepad.exe')
চ্যানজারের

ভবিষ্যতের দর্শনার্থীদের জন্য, আপনি যদি আর্গুমেন্ট সহ একটি অ্যাপ চালাতে চান (সাবপ্রসেস ব্যবহার করে) using আপনার নিজের যুক্তিগুলিকে স্থান দ্বারা বিভক্ত করতে হবে এবং প্রতিটি স্বতন্ত্রভাবে পাস করতে হবে। উদাহরণস্বরূপ, এটি একটি বাদুড় ফাইল থেকে হল: "C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif"। পাইথন, এটা হয়ে: ["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
আকিনুরি

উত্তর:


297

subprocess.callবিভিন্ন শেলের কনভেনশন উদ্ধৃতি দিয়ে সমস্যা মোকাবেলা করতে সমস্যা এড়াবে। এটি স্ট্রিংয়ের পরিবর্তে একটি তালিকা গ্রহণ করে, তাই যুক্তিগুলি আরও সহজেই সীমিত করা যায়। অর্থাত

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

81
উইন্ডোতে কাঁচা স্ট্রিং ব্যবহার করা অনেক সহজ: r "C: \ Temp \ abc \ Notepad.exe"
পিয়েরবিডিআর

1
হ্যাঁ, os.exec * ফাংশন বর্তমান প্রক্রিয়াটি প্রতিস্থাপন করবে, তাই আপনার অজগর প্রক্রিয়া আর চলবে না। এগুলি ইউনিক্সে আরও ব্যবহার করা হয় যেখানে শেল কমান্ড প্রবর্তনের জন্য সাধারণ পদ্ধতিটি কাঁটাচামচ () এবং তারপরে শিশুটিতে এক্সিকিউট () করা হয়।
ব্রায়ান

1
এটির জন্য উইন্ডোজ পদ্ধতিটি হল ওএস স্পন পরিবার, যা পরিবর্তে ব্যবহৃত হতে পারে। সাবপ্রসেস যদিও আরও বহনযোগ্য, এবং প্রক্রিয়াটি নিয়ন্ত্রণে আরও নমনীয়তা সরবরাহ করে (ইনপুট / আউটপুট ইত্যাদি ক্যাপচার করে), তাই এটি পছন্দনীয়।
ব্রায়ান

6
@ পিয়ারবিডিআর: এমন একটি মামলা রয়েছে যেখানে কাঁচা ছাঁচগুলি কাজ করবে না: যেখানে আপনার পিছনে স্ল্যাশ দরকার। যেমন r'c: oo foo \ bar \ '। আসলে, পরিবর্তে ফরোয়ার্ড স্ল্যাশ ব্যবহার করা সম্ভবত এটি আরও ভাল। এগুলি উইন্ডোজ এপিআই জুড়ে গৃহীত হয় (যদিও কিছু শেল কমান্ড (যেমন অনুলিপি দ্বারা সবসময় না))
ব্রায়ান

1
পাইথন> = 3.5 এর জন্য ডকস.পিথন.আর.subprocess.callsubprocess.run
/

67

এটি করার একটি আলাদা উপায় এখানে।

আপনি যদি উইন্ডোজটি এক্সপ্লোরারটিতে ফাইলটি ডাবল-ক্লিক করার মতো, বা ডস "স্টার্ট" কমান্ডকে যুক্তি হিসাবে ফাইলের নাম দেওয়ার মতো ব্যবহার করে থাকেন: ফাইলটি যে কোনও অ্যাপ্লিকেশন (যদি থাকে) এর সাথে খোলা থাকে তবে এর এক্সটেনশনের সাথে সম্পর্কিত ।

filepath = 'textfile.txt'
import os
os.startfile(filepath)

উদাহরণ:

import os
os.startfile('textfile.txt')

নোটপ্যাড .txt ফাইলের সাথে যুক্ত থাকলে এটি নোটপ্যাডের সাথে টেক্সটফিল.টিএসটিএসটি খুলবে।


1
* নিক্স সিস্টেমের জন্য কি কোনও সমতুল্য ফাংশন রয়েছে?
রোমেনো

@ রোমেনো: আপনি চেষ্টা করতে পারেন: webbrowser.open("textfile.txt")এটি একটি পাঠ্য সম্পাদক খুলতে হবে। এছাড়াও দেখুন "সম্পূর্ণ দ্বিতীয় প্রোগ্রামটি নিজে থেকে শুরু করুন, যেন আমি কেবল 'এটিতে ডাবল ক্লিক করেছে'" "
jfs

আমার সেটআপ textfile.txt প্রয়োজনের উপর উদ্ধৃতির মধ্যে হতে, যেমন:os.startfile('path\to\textfile.txt')
thdoan

34

বাইরেরতম উদ্ধৃতিগুলি পাইথন নিজেই গ্রাস করেছে এবং উইন্ডোজ শেল এটি দেখতে পায় না। উপরে উল্লিখিত হিসাবে, উইন্ডোজ কেবল ডাবল-কোট বোঝে। পাইথন ফরোয়ার্ড-স্ল্যাশ উইন্ডোজ এর ব্যাকস্ল্যাশগুলিতে রূপান্তর করবে, যাতে আপনি ব্যবহার করতে পারেন

os.system('"C://Temp/a b c/Notepad.exe"')

এটি পাইথন দ্বারা গ্রাস করা হয়, যা পরে সিএমডি.এক্সইতে "সি: // টেম্প / অ্যাবসি / নোটপ্যাড.এক্সই" (উইন্ডোজ পাথ হিসাবে, কোনও ডাবল-ব্যাকস্ল্যাশগুলির প্রয়োজন হয় না) পাস করে passes


1
এটি os.system('curl URL > file')সত্যিই বড় ফাইলগুলির জন্য যেখানে সিআরএল এর অগ্রগতি মিটার রিফ্রেশ দেখতে চাই এমন দৃশ্যে এটি সেরা বলে মনে হয় ।
জ্যাচ ইয়ং

একটি ব্যাকস্ল্যাশ পর প্রথম চিঠি বিশেষ অর্থ থাকে (অর্থাত \t, \nতারপর নির্দিষ্ট ব্যাকস্ল্যাশ দ্বিগুণ করা আবশ্যক যে, ইত্যাদি)। উইন্ডোজ পাথ হওয়ার সাথে এর কোনও যোগসূত্র নেই।
ইথান ফুরম্যান

1
নোট করুন যে আপনি os.system()উইন্ডোজে ব্যবহার করলে সেমিডিডি উইন্ডোটি খোলা থাকবে এবং যতক্ষণ না আপনি এটি শুরু হওয়া প্রক্রিয়াটি বন্ধ করে দেবেন। আইএমএইচও এটি ব্যবহার করা ভাল os.startfile()
thdoan

1
ভুলে যাবেন নাimport os
বেসি

আমার জন্য কাজ করে না স্ট্যাকওভারফ্লো.com
গুলজার

19

কমপক্ষে উইন্ডোজ 7 এবং পাইথন ৩.১- os.systemএ উইন্ডোজ কম্যান্ড লাইনটি ডাবল-কোটেড চায় যদি কমান্ডের পথে ফাঁকা স্থান থাকে। উদাহরণ স্বরূপ:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

সত্যিকারের বিশ্বের উদাহরণ যা আমাকে স্ট্যাম্পিং করছিল ভার্চুয়ালবক্সে একটি ড্রাইভ ক্লোনিং করছিল। subprocess.callসমাধান উপরে কিছু প্রবেশের অধিকার সংখ্যার কারণ কাজ না করে, কিন্তু যখন আমি কমান্ড ডাবল উদ্ধৃত, os.systemখুশি হয়ে ওঠে:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

ঐটা এটা ছিল! আমি যেতে চাই subprocess, কিন্তু কখনও কখনও os.systemএবং os.popen(...).read()টাইপ করতে খুব দ্রুত। বিটিডাব্লু, আপনার একক ভিতরে ডাবল উদ্ধৃতি এড়াতে '""C:\\Temp\\a b c\\Notepad.exe""'হবে না , অর্থাত্ করবে।
টমাসজ গ্যান্ডার

9
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

এবং মনে হচ্ছে এই পদ্ধতির সাথে কোনও উদ্ধৃতি দরকার নেই, যেমন win32api.WinExec ('পাইথোনউ.এক্সই ডি: \ ওয়েব টুপি \ ওয়েব টুপি-কে ওয়েলকাম') ব্যাকগ্রাউন্ডে ওয়েবেপিপি শিডিউলার শুরু করে।
টিম রিচার্ডসন

@ রহুল এবং এটি কার্যকর করার পক্ষে যুক্তি ব্যতীত কি করে? সুতরাং আপনি যদি নোটপ্যাড কোনও ফাইল খুলতে চান বা এটি পৃথক?
sayth


3

আমার সন্দেহ হয় আপনি যখন উইন্ডোজ শর্টকাট ব্যবহার করেন ঠিক তেমন সমস্যা ... এটি ব্যবহার করে দেখুন:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

দুঃখিত, এটি কাজ করে না, এটিকে প্রতিফলিত করতে সম্পাদিত প্রশ্ন।
লাসে ভি কার্লসেন

আমি মনে করি উইন্ডোজ শুধুমাত্র ব্যবহার করে "বদলে 'মূল্য উদ্ধৃতি জন্য এটি সম্ভবত কাজ যদি এই পরিবর্তন হবে তবে আপনার যদি এখনও সমস্যা পাতিত করব সঙ্গে আপনি এমবেডেড আছে কোট
ব্রায়ান

আমি ভেবেছিলাম এটি দুটিই নিয়েছে, তবে আপনি সম্ভবত ঠিক বলেছেন। আমি জানি এটি ডাবল কোট সহ (শেল অ্যাটলাস্টে) কাজ করে।
ম্যাথু Scharley

+1 এটি সেরা, উইন্ডোজ এক্সপি, 2007 এর হোম সংস্করণটি দুর্দান্তভাবে কাজ করেছে

0

মনে করুন আমরা আপনার জ্যাঙ্গো ওয়েব সার্ভারটি (লিনাক্সে) চালাতে চাই যে আপনার পথের (পথ = '/home/<you>/<first-path-section> <second-path-section>') মধ্যে স্থান রয়েছে , তাই নিম্নলিখিতগুলি করুন:

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[ দ্রষ্টব্য ]:

  • অনুমতি অ্যাক্সেস ভুলবেন না chmod 755 -R <'yor path'>
  • manage.py উত্পাদিত হয়: chmod +x manage.py


0

সাব-প্রসেসের প্রয়োজন নেই, এটি সহজেই অর্জন করা যায়

গিটপথ = "সি: \ প্রোগ্রাম ফাইলগুলি it গিট \ গিট-বাশ.এক্সে" # অ্যাপ্লিকেশন ফাইলের পাথটি মাইকেসে এর GITBASH os.startfile (গিটপথ)

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