পাইথনে বাইরের প্রোগ্রাম (এক্সিকিউটেবল) চলছে?


92

আমি কেবল পাইথন-এ কাজ শুরু করেছি এবং আমি পাইথন থেকে বাইরের এক্সিকিউটেবল চালানোর চেষ্টা করছি।

ফরট্রানে লেখা একটি প্রোগ্রামের জন্য আমার এক্সিকিউটেবল আছে। ধরা যাক এক্সিকিউটেবলের নাম ফ্লো.এক্সি। এবং আমার নির্বাহযোগ্য অবস্থিত হয় C:\Documents and Settings\flow_model। আমি ওএস.সিস্টেম এবং পপেন কমান্ড উভয়ই চেষ্টা করেছিলাম তবে এখন পর্যন্ত আমি এটি কার্যকর করতে পারিনি। নিম্নলিখিত কোডটি মনে হচ্ছে এটি কমান্ড উইন্ডোটি খোলার পরেও এটি মডেলটি কার্যকর করবে না।

# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")

আমি এটা কিভাবে ঠিক করবো?


উত্তর:


44

সেই অনুসরণকারী শূণ্যস্থান সত্যিই একটি বিরক্ত :-( হতে পারে। চেষ্টা os.chdir('C:/Documents\ and\ Settings/')জন্য আপেক্ষিক পাথ দ্বারা অনুসরণ os.system, subprocessপদ্ধতি, বা যাই হোক না কেন ...

যদি হোয়াইটস্পেস-ইন-পাথের বাধা ব্যর্থ করার সর্বাত্মক প্রচেষ্টা ব্যর্থ হয়, তবে আমার পরবর্তী সেরা পরামর্শটি হল আপনার গুরুত্বপূর্ণ পথে ফাঁকা থাকা এড়ানো । আপনি যদি একটি শূন্যস্থান-কম ডিরেক্টরির বানাতে পারে না, গুরুত্বপূর্ণ কপি .exeসেখানে ফাইল, এবং চেষ্টা করুন যে ? সেই ধ্বংসাত্মক স্থানগুলি কি আপনার মঙ্গলার্থের জন্য একেবারে প্রয়োজনীয়? ...?


4
অ্যালেক্স, ধন্যবাদ এটিও কাজ করেছিল। আমার আর একটি প্রশ্ন আছে যদি আপনি কিছু মনে করেন না। যদি আমার এক্সিকিউটেবল আমার ইনপুট ফাইলটির নাম জিজ্ঞাসা করে তবে কীভাবে? আমি স্টিডিন ব্যবহার করে এটি করার চেষ্টা করেছি তবে এতদিন সফল হতে পারিনি?
মেসুত

4
@ মেসুট, ফাইল নামটি "জিজ্ঞাসা" করতে ব্যবহার করে তা কার্যকর কী? যদি এটির নিজস্ব মান-ইনপুট হয়, উদাহরণস্বরূপ, আপনি subprocess.Popenসেখানে আপনার পছন্দসই মানগুলি পাইপ করতে সক্ষম হতে পারেন । যদি এটি আরও গভীর হয় ("কনসোল" ইনপুট ব্যবহার করে), ওয়েক্সপ্যাক্ট, sage.math.washington.edu/home/goreckc/sage/wexpect ব্যবহার করে দেখুন
অ্যালেক্স মার্টেলি

ইনপুট ফাইল একই ফোল্ডারে একটি প্রাথমিক .txt ফাইল। কোড এখনই সেমিডি উইন্ডো থেকে এক্সি খুলবে। এবং এক্সিকিউটেবল ইনপুট ফাইলের নাম জিজ্ঞাসা করে। কোডের মধ্যে আমি এই নামটি (সম্ভবত একটি পথ হিসাবে) সংজ্ঞায়িত করতে পারি এমন কোনও উপায় আছে? আমি সাবপ্রসেস.পোপেন চেষ্টা করেছি এবং আমি ভেরিয়েবলগুলি দেখার চেষ্টা করেছি। আমি ভেবেছিলাম যে আমি স্টিডিন ব্যবহার করতে পারি তবে সত্যিই কাজ করতে পারিনি। আমি সত্যিই প্রশংসা করব যদি আপনি আমাকে সি: \ ফ্লো_মোডেল হিসাবে নির্বাহযোগ্য, প্রবাহের নাম হিসাবে এক্সপ্রেসিটেবলের সাথে সাবপ্রসেস.পোপেন সহ একটি নমুনা দিতে পারেন তবে একই ফোল্ডারে sac_bsl.txt হিসাবে অবস্থিত ইনপুট ফাইলের নাম
মেসুত

"ইনপুট ফাইলের নাম জিজ্ঞাসা করুন" অংশটি হ'ল সমস্যাযুক্ত। আমি যেমন ইতিমধ্যে উল্লেখ করেছি যে সেই এক্স কোডটি কীভাবে করা হয় সে সম্পর্কে কিছুই না জেনে রাখা wexpectসর্বাধিক সমাধান, কারণ এটি আপনাকে একটি সিমিডি উইন্ডোতে ডাকার সময় সেই এক্স ফাইলটি ঠিক কী দেখতে পাবে তা অনুকরণ করতে দেয়।
অ্যালেক্স মার্টেলি

42

পাইথন ২.7 বা ততোধিক উচ্চতর (বিশেষত পাইথন ৩.৫ এর পূর্বে) ব্যবহার করে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) আরগস দ্বারা বর্ণিত কমান্ড চালায়। কমান্ডটি সম্পন্ন হওয়ার জন্য অপেক্ষা করে, তারপরে রিটারকোড বৈশিষ্ট্যটি প্রদান করে।
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) আর্গুমেন্ট সহ কমান্ড চালায়। কমান্ডটি শেষ হওয়ার অপেক্ষায়। যদি রিটার্ন কোডটি শূন্য হয় তবে ফিরে আসে, অন্যথায় CalledProcessError উত্থাপন করে। CalledProcessError অবজেক্টটির রিটার্ন কোডটি বৈশিষ্ট্যে রিটার্ন কোড থাকবে

উদাহরণ: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

নিয়মিত পাইথন স্ট্রিংগুলিতে, character ইউ বর্ণচিহ্নের সংমিশ্রণটি বর্ধিত ইউনিকোড কোড পয়েন্ট এড়িয়ে যাওয়ার ইঙ্গিত দেয়।

এখানে ডকুমেন্টেশনের লিঙ্কটি রয়েছে: http://docs.python.org/3.2/library/subprocess.html

পাইথন ৩.৫+ এর জন্য আপনি এখন অনেক ক্ষেত্রে রান () ব্যবহার করতে পারবেন: https://docs.python.org/3.5/library/subprocess.html#subprocess.run



34

সবচেয়ে সহজ উপায়:

import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")

এটি কাজ করে; আমি এটা চেষ্টা করেছি.


4
সঠিকভাবে কাজ করছে, তবে-স্টার্ট ইত্যাদির মতো প্যারামিটার যুক্ত করার কোনও উপায় আছে কি?
বাসেম শাহিন

4
কাজ করে না: module 'os' has no attribute 'startfile'। (পাইথন ৩..6 ব্যবহার করে)
not2qubit

স্পষ্টতই উইন্ডোজ সম্পর্কিত কোনও কিছুর উপরে ডকুমেন্টেশন দেয় এমন ছাপের বিপরীতে কাজ করে না ।
not2qubit

দেখে মনে হচ্ছে কেবল আইপথন দিয়ে কাজ করা হয়
user3273814

24

আমি যদি আপনার হয়ে থাকি তবে আপনার পথের সামনে একটি 'আর' tryোকানোর চেষ্টা করতাম এটি ইঙ্গিত করার জন্য এটি কাঁচা স্ট্রিং - এবং তারপরে আপনাকে ফরোয়ার্ড স্ল্যাশ ব্যবহার করতে হবে না। উদাহরণ স্বরূপ:

os.system(r"C:\Documents and Settings\flow_model\flow.exe")

19

আপনার ব্যবহার সঠিক। আমি বাজি ধরেছি যে আপনার বাহ্যিক প্রোগ্রাম, ফ্লো.এক্সএইকে এটি ডিরেক্টরিতে চালিত করা দরকার, কারণ এটি সেখানে সঞ্চিত কিছু বাহ্যিক ফাইল অ্যাক্সেস করে।

সুতরাং আপনি চেষ্টা করতে পারেন:

import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')

(একক উদ্ধৃতিতে ডাবল উদ্ধৃতিগুলি সম্পর্কে সতর্ক থাকুন ...)


পুরোপুরি কাজ করে, কীভাবে কেউ সরাসরি ডেটাফ্রেমে ফলাফলগুলি সঞ্চয় করে?
সাদে



4

চেষ্টা করুন

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])

এটি চেষ্টা এবং একই জিনিস ঘটেছে। দেখে মনে হচ্ছে এটি সেন্টিমিডি উইন্ডোটি খোলে তবে এটি কার্যকর করতে সক্ষম হয় না able আমি এক্সিকিউটেবলকে আলাদাভাবে চেষ্টা করেছি এবং এটি ঠিক আছে। আমি ফোল্ডারটিকে সি: / ফ্লো_ মডেল হিসাবে সরিয়েছি। কিছু পার্থক্য করেনি। ??
মেসুত

2

এটি যদি আমি থাকতাম তবে আমি EXE ফাইলটি মূল ডিরেক্টরিতে (সি :) রেখে দিতাম এবং দেখি যে এটি এর মতো কাজ করে কিনা। যদি তা হয় তবে এটি সম্ভবত ডিরেক্টরি নামের (ইতিমধ্যে উল্লিখিত) ফাঁকা স্থান। যদি তা না হয় তবে এটি কিছু পরিবেশগত পরিবর্তনশীল হতে পারে।

এছাড়াও, আপনি stderr পরীক্ষা করার চেষ্টা করুন (int3 দ্বারা পূর্ববর্তী উত্তর ব্যবহার করে):

import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \
                           stderr = subprocess.PIPE)
if process.stderr:
    print process.stderr.readlines()

কোডটি পুরোপুরি সঠিক না হতে পারে কারণ আমি সাধারণত পপেন বা উইন্ডোজ ব্যবহার করি না তবে ধারণাটি দেওয়া উচিত। এটি ভাল হতে পারে যে ত্রুটি বার্তাটি ত্রুটি প্রবাহে রয়েছে।


2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")

4
আপনার কোড কেন এই প্রশ্নটি সমাধান করে তার একটি ব্যাখ্যা যুক্ত করুন।
rje

এই পোস্টটি মূলত * .exe ফাইলটিকে উইন্ডোজ * .bat ফাইল ব্যবহার করার কারণে কার্যকর করা হচ্ছে বলে চিকিত্সা করছে।
সামাক্ট

2

পাইথন ২.6-এ কোটেশন-এর অভ্যন্তরের স্ট্রিংটি "এবং অ্যাস্টোস্ট্রোফের চিহ্নগুলি ব্যবহার করুন। এছাড়াও একক / পরিবর্তন দ্বিগুণ করুন। আপনার কাজের উদাহরণটি দেখতে পাবেন:

import os
os.system("'C://Documents and Settings//flow_model//flow.exe'") 

এছাড়াও যদি আপনার প্রোগ্রামটি আটকানো হয় তবে আপনি যে কোনও প্যারামিটার ব্যবহার করতে পারেন।

os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')

অবশেষে আপনি স্ট্রিং ভেরিয়েবল ব্যবহার করতে পারেন, উদাহরণস্বরূপ পাইথন থেকে সরাসরি gnuplot ব্যবহার করে চক্রান্ত করা:

this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot'

this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"'
os.system(this_program+" "+this_par)

1

এটি কি C:\Documentsযুক্তি দিয়ে কার্যকর করার চেষ্টা করছে "and", "Settings/flow_model/flow.exe"?

এছাড়াও, আপনি বিবেচনা করতে পারেন subprocess.call()


0

এটি সঠিক ব্যবহার,

আপনি প্রোগ্রামটি cmd.exe এর অধীনেও চালাতে চাইতে পারেন যাতে আপনি প্রবাহ.এক্সে থেকে কোনও আউটপুট দেখতে পান যা কোনও ত্রুটি নির্দেশ করে।


0

বিভিন্ন সমাধানের প্রচুর পরিমাণ রয়েছে এবং ফলাফলগুলি দৃ strongly়তার সাথে নির্ভর করবে:

  • আপনি যে ওএসটি ব্যবহার করছেন: উইন্ডোজ, সাইগউইন, লিনাক্স, ম্যাকোস
  • পাইথন সংস্করণ আপনি ব্যবহার করছেন: পাইথন 2 বা পাইথন 3 এক্স

যেহেতু আমি এমন কিছু জিনিস আবিষ্কার করেছি যেগুলি কেবল উইন্ডোজে কাজ করার জন্য দাবি করা হয়েছে, সম্ভবত তা নয় কারণ আমি সাইগউইনকে ব্যবহার করেছি যা উইন্ডোজ পাথগুলি মোকাবেলা করার জন্য ওএসের পথকে ছাড়িয়ে যাচ্ছে। অন্যান্য জিনিসগুলি কেবল খাঁটি * নিক্স ভিত্তিক ওএস বা পাইথন 2 বা 3 এ কাজ করে।

আমার অনুসন্ধানগুলি এখানে:

  • সাধারণত বলতে গেলে, os.system()সবচেয়ে ক্ষমাশীল পদ্ধতি।
  • os.startfile()ক্ষমাশীল ক্ষমাশীল। (শুধুমাত্র উইন্ডোজ & আপনি ভাগ্যবান যদি)
  • subprocess.Popen([...]) প্রস্তাবিত নয়
  • subprocess.run(winView, shell=True) প্রস্তাবিত উপায়!
  • মনে রাখবেন যে subprocessকোনও কিছুর জন্য ব্যবহার করা কোনও সুরক্ষা ঝুঁকি তৈরি করতে পারে ।

এগুলি চেষ্টা করুন:

import os, subprocess
...
winView = '/cygdrive/c/Windows/explorer.exe %s' % somefile
...
# chose one of these:
os.system(winView)
subprocess.Popen(['/cygdrive/c/Windows/explorer.exe', 'somefile.png'])
subprocess.run(winView, shell=True)

প্রশ্ন: explorerআপনি উইন্ডোজে কেন ব্যবহার করতে চান ?

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


0

উপরের প্রশ্নের জন্য এই সমাধানটি কাজ করে।

আপনার এক্সিকিউটেবল ফাইলটি যেখানে অবস্থিত সেখানে কেবল সেই পথটি পরিবর্তন করুন।

import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system("C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\flowwork.exe")


'''import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\pdftopng.exe test1.pdf rootimage")'''

এখানে test1.pdf রুটিমেজটি আমার কোডের জন্য।


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