পাইথনে যদি এক্সিকিউটেবলের উপস্থিত থাকে?


297

পাইথনে, কোনও এক্সিকিউটেবল প্রোগ্রাম বিদ্যমান থাকলে পরীক্ষা করার কোনও পোর্টেবল এবং সহজ উপায় আছে?

সাধারণভাবে আমি whichকমান্ডের মতো কিছু বোঝাতে চাই যা নিখুঁত হবে। আমি ম্যানুয়ালি পথের সন্ধান করতে চাইছি না বা এটি Popen& আল দিয়ে চালানোর চেষ্টা করার সাথে জড়িত কিছু আছে এবং এটি ব্যর্থ হয়েছে কিনা তা দেখুন (এটি এখন আমি করছি, তবে এটি কল্পনা করুন launchmissiles)


4
PATH এনভায়রনমেন্ট ভেরিয়েবল অনুসন্ধানে কী দোষ হয়েছে? ইউনিক্স 'কোন' কমান্ডটি কী করে বলে আপনি মনে করেন?
জে

1
Stdlib থেকে কোন.পি স্ক্রিপ্টটি কি সহজ উপায়?
jfs

@ জেএফ - the.py স্ক্রিপ্ট সহ। পাইথনের সাথে 'ls' নির্ভর করে এবং অন্যান্য কিছু মন্তব্য ইঙ্গিত দেয় যে পাইওটর একটি ক্রস-প্ল্যাটফর্মের উত্তর খুঁজছিলেন।
জয়

@ জায়ে: মন্তব্যের জন্য ধন্যবাদ। আমার উইন্ডোজটিতে কোর্টিল ইনস্টল আছে তাই আমি খেয়াল করিনি যে কোনটি.পি ইউনিক্স-নির্দিষ্ট।
jfs

এছাড়াও রয়েছে which, তৃতীয় পক্ষের মডিউল: কোড. activestate.com/pypm/ যা
শ্রীধর রত্নকুমার

উত্তর:


321

সবচেয়ে সহজ উপায় আমি এটি ভাবতে পারি:

def which(program):
    import os
    def is_exe(fpath):
        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

সম্পাদনা করুন : হালনাগাদ কেস পরিচালনা করার জন্য যুক্তি অন্তর্ভুক্ত করার জন্য আপডেট কোড নমুনা যেখানে প্রদত্ত যুক্তি ইতিমধ্যে নির্বাহযোগ্য, অর্থাৎ "যা / বিন / এলএস" এর সম্পূর্ণ পথ। এটি UNIX 'যা' কমান্ডের আচরণ অনুকরণ করে।

সম্পাদনা করুন : প্রতি মন্তব্যসমূহে os.path.exists () এর পরিবর্তে os.path.isfile () ব্যবহার করার জন্য আপডেট হয়েছে।

সম্পাদনা করুন : path.strip('"')এখানে করা ভুল জিনিস বলে মনে হচ্ছে। উইন্ডোজ বা পসিক্স উভয়ই উদ্ধৃত PATH আইটেমগুলিকে উত্সাহিত করতে প্রদর্শিত হবে না।


ধন্যবাদ জে, আমি আপনার উত্তরটি গ্রহণ করি, যদিও আমার জন্য এটি আমার প্রশ্নের নেতিবাচক দ্বারা উত্তর দেয়। এই ধরনের কোনও ফাংশন লিবগুলিতে বিদ্যমান নেই, আমাকে কেবল এটি লিখতে হবে (আমি স্বীকার করি যে আমার সূত্রটি যথেষ্ট পরিষ্কার ছিল না যা আমি জানি যা কি করে)।
পিয়োটার লেসনিকি

1
জে, আপনি যদি আমার উত্তর অনুসারে সম্পূর্ণ করেন (সম্পূর্ণ 'ডাব্লু' আছে) তাই আমি আমার সরিয়ে ফেলতে পারি।
পিয়োটার লেসনিকি

2
কিছু ওএসের জন্য আপনাকে এক্সিকিউটেবলের এক্সটেনশন যুক্ত করতে হতে পারে। উদাহরণস্বরূপ, উবুন্টুতে আমি কোনটি লিখতে পারি ("scp") তবে উইন্ডোজে আমার কোনটি লিখতে হবে ("scp.exe")।
ওয়াফলম্যান

13
আমি "os.path.exists" কে "os.path.isfile" এ পরিবর্তন করার পরামর্শ দিই। অন্যথায় ইউনিক্সে এটি ভুলভাবে + x বিট সেটটির সাথে একটি ডিরেক্টরি মেলে। আমি এটিকে ফাংশনের শীর্ষে যুক্ত করতে দরকারী বলে মনে করি: ইম্পোর্ট sys; যদি sys.platform == "win32" এবং program.endswith ("। exe") নয়: প্রোগ্রাম + = ".exe"। উইন্ডোজের অধীনে আপনি "ক্যালক" বা "ক্যালক.এক্সি" উল্লেখ করতে পারেন, ঠিক যেমন কোনও সেন্টিমি উইন্ডোতে।
কেভিন ইভারসেন

1
@KevinIvarsen একটি ভালো বিকল্প মান মাধ্যমে looping হবে PATHEXTকারণ env Var commandযত বৈধ command.comহিসাবে scriptবনামscript.bat
Lekensteyn

325

আমি জানি এটি একটি প্রাচীন প্রশ্ন, তবে আপনি ব্যবহার করতে পারেন distutils.spawn.find_executable। এটি অজগর ২.৪ থেকে নথিভুক্ত হয়েছে এবং পাইথন ১.6 থেকে বিদ্যমান রয়েছে।

import distutils.spawn
distutils.spawn.find_executable("notepad.exe")

এছাড়াও, পাইথন 3.3 এখন অফার করে shutil.which()


7
চালু win32, অনুসন্ধানের জন্য এক্সটেনশনের তালিকাটি ব্যবহার না করে distutils.spawn.find_executableবাস্তবায়ন কেবল .exeঅনুসন্ধান করে %PATHEXT%। এটি দুর্দান্ত নয়, তবে এটি কারওর জন্য প্রয়োজন সমস্ত ক্ষেত্রে কার্যকর হতে পারে।
রাকলাইস

7
উদাহরণস্বরূপ ব্যবহার:from distutils import spawn php_path = spawn.find_executable("php")
কোডফ্রেক

6
আপাতদৃষ্টিতে distutils.spawnনির্ভরযোগ্যভাবে উপলভ্য নয়: ওএস এক্স 10.10 এ পাইথন ২.7..6 এর আমার সিস্টেম ইনস্টল (/ usr / bin / python) সহ, আমি পেয়েছি: AttributeError: 'module' object has no attribute 'spawn'যদিও আশ্চর্যের সাথে এটি পাইথনের একই সংস্করণ সহ একই মেশিনে কাজ করে তবে একটি ভার্চুয়ালেনভ ইনস্টল।
জোশ কুপারশ্মিদট

8
@ জোশকুপারশ্মিডিট, সুনির্দিষ্টের চেয়ে সিনট্যাক্সটি নিশ্চিত করুন import distutils.spawnবা অনুসরণ করুন । অন্যথায় এটি অ্যাক্সেসযোগ্য নাও হতে পারে এবং এটি উপস্থিত থাকলেও আপনি উপরেরটি পাবেন । from distutils import spawnimport distutilsAttributeError
জন সেন্ট জন জন


39

অজগর জন্য 3.2 এবং তার আগের:

my_command = 'ls'
any(os.access(os.path.join(path, my_command), os.X_OK) for path in os.environ["PATH"].split(os.pathsep))

এই একটি এক-লাইনের হয় জে এর উত্তর একটি ল্যামডা func যেমন এছাড়াও এখানে:

cmd_exists = lambda x: any(os.access(os.path.join(path, x), os.X_OK) for path in os.environ["PATH"].split(os.pathsep))
cmd_exists('ls')

বা শেষ অবধি, একটি কার্য হিসাবে ইন্ডেন্ট করা:

def cmd_exists(cmd):
    return any(
        os.access(os.path.join(path, cmd), os.X_OK) 
        for path in os.environ["PATH"].split(os.pathsep)
    )

অজগর জন্য 3.3 এবং পরবর্তী:

import shutil

command = 'ls'
shutil.which(command) is not None

জান-ফিলিপ গেহর্ককের এক-লাইনার হিসাবে উত্তর :

cmd_exists = lambda x: shutil.which(x) is not None

একটি Def হিসাবে:

def cmd_exists(cmd):
    return shutil.which(cmd) is not None

1
"ফাংশন হিসাবে ইন্টেন্টেড" সংস্করণটি চলকটি xযেখানে ব্যবহার করা উচিত তা ব্যবহার করেcmd
0x89

os.path.join(path, cmd)ফাইলও আছে কিনা তা পরীক্ষা করার জন্য আপনাকে অবশ্যই একটি পরীক্ষা যোগ করতে হবে , না? সামগ্রিকভাবে, ডিরেক্টরিতে এক্সিকিউটেবল বিট সেটও থাকতে পারে ...
MestreLion

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

1
@ থারস্মমনার: আমি এটি নিশ্চিত করেছি এবং এটির জন্য প্রকৃতপক্ষে ফাইলের পরীক্ষা প্রয়োজন। একটি সহজ পরীক্ষা:mkdir -p -- "$HOME"/bin/dummy && PATH="$PATH":"$HOME"/bin && python -c 'import os; print any(os.access(os.path.join(path, "dummy"), os.X_OK) for path in os.environ["PATH"].split(os.pathsep))' && rmdir -- "$HOME"/bin/dummy
MestreLion

1
and os.path.isfile(...)উপযুক্ত জায়গাগুলিতে একটি সাধারণ যোগ করা ঠিক করতে যথেষ্ট
MestreLion

19

উইন্ডোতে ফাইল এক্সটেনশন নির্দিষ্ট করতে মনে রাখবেন। অন্যথায়, আপনাকে পরিবেশের পরিবর্তনশীল is_exeব্যবহার করে উইন্ডোগুলির জন্য অনেক জটিল লিখতে হবে PATHEXT। আপনি কেবল ফাইন্ডপথটি ব্যবহার করতে চাইতে পারেন ।

OTOH, আপনি এমনকি নির্বাহী জন্য অনুসন্ধান করতে বিরক্ত করছেন কেন? অপারেটিং সিস্টেমটি popenকল করার অংশ হিসাবে এটি আপনার জন্য করবে এবং এক্সিকিউটেবলটি খুঁজে পাওয়া না গেলে একটি ব্যতিক্রম উত্থাপন করবে। আপনাকে যা করতে হবে তা হল প্রদত্ত ওএসের জন্য সঠিক ব্যতিক্রম catch মনে রাখবেন যে উইন্ডোজটিতে সন্ধান না পাওয়া subprocess.Popen(exe, shell=True)গেলে নিরবে ব্যর্থ হবে exe


একত্রিত PATHEXTউপরের বাস্তবায়ন মধ্যে which(জে এর উত্তরে):

def which(program):
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK) and os.path.isfile(fpath)

    def ext_candidates(fpath):
        yield fpath
        for ext in os.environ.get("PATHEXT", "").split(os.pathsep):
            yield fpath + ext

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            for candidate in ext_candidates(exe_file):
                if is_exe(candidate):
                    return candidate

    return None

1
এটি গ্রহণযোগ্য উত্তরে একটি বাগ ঠিক করেছে, তার পরিবর্তে এই উত্তরটি শীর্ষে থাকা উচিত বলে মনে করেন।
নিটে লুও

চালাক ব্যবহারের yieldমধ্যে ext_candidates, আমাকে কিভাবে যে শব্দ কাজ ভাল করে বুঝতে দিলেন
গ্রান্ট হামফ্রেস

15

* নিক্স প্ল্যাটফর্মের জন্য (লিনাক্স এবং ওএস এক্স)

এটি আমার পক্ষে কাজ করছে বলে মনে হচ্ছে:

লিনাক্সে কাজ করার জন্য সম্পাদিত , মস্ত্রিওনকে ধন্যবাদ

def cmd_exists(cmd):
    return subprocess.call("type " + cmd, shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0

আমরা এখানে যা করছি তা হ'ল বিল্টিন কমান্ড ব্যবহার typeএবং প্রস্থান কোড পরীক্ষা করা। যদি এরকম কোনও আদেশ না typeথাকে তবে 1 (বা যাইহোক একটি শূন্য-স্থিতি কোড) দিয়ে প্রস্থান করবেন।

স্টাডাউট এবং স্টডার সম্পর্কে কিছুটা typeকমান্ডের আউটপুটটি নিঃশব্দ করা , যেহেতু আমরা কেবল প্রস্থান স্থিতি কোডে আগ্রহী।

ব্যবহারের উদাহরণ:

>>> cmd_exists("jsmin")
True
>>> cmd_exists("cssmin")
False
>>> cmd_exists("ls")
True
>>> cmd_exists("dir")
False
>>> cmd_exists("node")
True
>>> cmd_exists("steam")
False

2
আপনি কি নিশ্চিত যে এটি কাজ করে? এটি খুব সুন্দর পদ্ধতির, তবে typeএটি একটি শেল বিল্টইন, এক্সিকিউটেবল ফাইল নয়, সুতরাং subprocess.call()এখানে ব্যর্থ।
MestreLion

1
আপনি এটি চেষ্টা করেছেন বা আপনি কেবল তাত্ত্বিক করছেন? এটি যাইহোক আমার ম্যাক উপর কাজ করে।
হেসেন

আমি এটি উবুন্টু 12.04 এ চেষ্টা করেছি, এটি ছুড়ে ফেলেছে OSError: [Errno 2] No such file or directory। ম্যাকের typeমধ্যে সম্ভবত একটি আসল কমান্ড
মাস্ট্রেলিয়ন

2
পরে অনেক অ্যাড: পরীক্ষার, আমি কিভাবে ঠিক করা পাওয়া করেছি shell=Trueএবং প্রতিস্থাপন ["type", cmd]জন্য"type " + cmd
MestreLion

4
মনোযোগ দিন: ভেরিয়েবল "সেমিডিডি" তে বৈধ ডেটা রয়েছে তা নিশ্চিত হয়ে নিন। যদি এটি কোনও বাহ্যিক উত্স থেকে আসে তবে কোনও খারাপ লোক আপনাকে "ls; rm -rf /" দিতে পারে। আমি মনে করি ইন পাইথন সলিউশন (সাবপ্রসেস ছাড়াই) আরও ভাল। পরবর্তী পয়েন্ট: আপনি যদি এই পদ্ধতিটি প্রায়শই কল করেন তবে সাবপ্রসেস সমাধানটি অনেক ধীর গতিযুক্ত, কারণ প্রচুর প্রক্রিয়া তৈরি হওয়া দরকার।
guettli

7

পথের নামগুলিতে কিছু কার্যকর ফাংশনের জন্য os.path মডিউলটি দেখুন । কোনও বিদ্যমান ফাইল নির্বাহযোগ্য কিনা তা পরীক্ষা করতে , os.X_OK মোডের সাথে os.access (পথ, মোড) ব্যবহার করুন।

os.X_OK

অ্যাক্সেসের মোড প্যারামিটারে অন্তর্ভুক্ত করার মান () পথ নির্বাহ করা যায় কিনা তা নির্ধারণ করতে।

সম্পাদনা: প্রস্তাবিত which()বাস্তবায়নগুলি একটি ক্লু হারিয়েছে - os.path.join()পুরো ফাইলের নাম তৈরি করতে ব্যবহার করে ।


ধন্যবাদ, জিমল, সুতরাং মূলত আমার আমার উত্তর আছে: এ জাতীয় কোনও কার্য উপস্থিত নেই, আমাকে এটি নিজেই করতে হবে।
পিয়োটার লেসনিকি

Os.access ব্যবহার করবেন না। অ্যাক্সেস ফাংশন স্যুইড প্রোগ্রামগুলির জন্য ডিজাইন করা হয়েছে।
চ্যাংমিং সান

6

এই ভিত্তিতে অনুমতি চেয়ে ক্ষমা চাওয়া আরও সহজ isঅনুমতিের আমি কেবল এটি ব্যবহার করার চেষ্টা করব এবং ত্রুটিটি ধরব (এই ক্ষেত্রে ওএসআরআর - আমি চেক করেছিলাম ফাইলের অস্তিত্ব নেই এবং ফাইল নির্বাহযোগ্য নয় এবং তারা উভয়ই ওএসআরর দেয়)।

এক্সিকিউটেবলের কাছে --versionপতাকাটির মতো এমন কিছু থাকে যা দ্রুত নন-অপশন হয় এটি সাহায্য করে।

import subprocess
myexec = "python2.8"
try:
    subprocess.call([myexec, '--version']
except OSError:
    print "%s not found on path" % myexec

এটি কোনও সাধারণ সমাধান নয়, তবে প্রচুর ব্যবহারের ক্ষেত্রে এটি সহজতম উপায় হবে those যেখানে কোডটি একটি একক সুপরিচিত এক্সিকিউটেবলের সন্ধান করতে হবে।


3
এমনকি --versionনামের একটি প্রোগ্রামে কল করা খুব বিপজ্জনক launchmissiles!
x অ্যাপল

1
+1, আমি এই পদ্ধতির পছন্দ করি। ইএএফপি হ'ল সোনার পাইথন বিধি। সম্ভবত ইউআই স্থাপন করা বাদে আপনি launchmissiesযদি ক্ষেপণাস্ত্রগুলি চালিত না করতে চান তবে আপনি কেন তা জানতে চান ? এটি কার্যকর করা এবং প্রস্থান স্থিতি / ব্যাতিক্রমগুলির উপর
عمل করা ভাল

এই পদ্ধতির সমস্যা হ'ল আউটপুট কনসোলে মুদ্রিত হয়। আপনি যদি পাইপ এবং শেল ব্যবহার করেন = সত্য, তবে ওএসআরআর কখনই উত্থিত হয় না
নিক হাম্রিচ

ম্যাকোজে আপনার স্টাব এক্সিকিউটেবলও রয়েছে যেমন gitআপনি সম্ভবত অন্ধভাবে চালাতে চান না to
বব আমান

5

আমি জানি যে আমি এখানে কিছুটা নেক্রোম্যান্সার হয়ে উঠছি, তবে আমি এই প্রশ্নটি নিয়ে হোঁচট খেয়েছি এবং গৃহীত সমাধানটি আমার পক্ষে সব ক্ষেত্রে কার্যকর হয়নি, ভেবেছিল যে যাই হোক না কেন জমা দেওয়ার জন্য এটি কার্যকর হতে পারে। বিশেষত, "এক্সিকিউটেবল" মোড সনাক্তকরণ এবং ফাইল এক্সটেনশন সরবরাহের প্রয়োজনীয়তা। তদ্ব্যতীত, পাইথন ৩.৩ এর shutil.which(ব্যবহার PATHEXT) এবং পাইথন ২.৪ + এর distutils.spawn.find_executable(কেবল যুক্ত করার চেষ্টা করা হয় '.exe') কেবলমাত্র কয়েকটি ক্ষেত্রেই কাজ করে।

সুতরাং আমি একটি "সুপার" সংস্করণ লিখেছি (গৃহীত উত্তর, এবং PATHEXTসুরজের পরামর্শের ভিত্তিতে )। এই সংস্করণটি whichআরও কিছু পুঙ্খানুপুঙ্খভাবে টাস্কটি করে এবং প্রথমে "ব্রডফেজ" প্রস্থের প্রথম কৌশলগুলির একটি সিরিজ চেষ্টা করে এবং শেষ পর্যন্ত PATHস্থানটির উপর আরও সূক্ষ্ম অনুসন্ধানের চেষ্টা করে :

import os
import sys
import stat
import tempfile


def is_case_sensitive_filesystem():
    tmphandle, tmppath = tempfile.mkstemp()
    is_insensitive = os.path.exists(tmppath.upper())
    os.close(tmphandle)
    os.remove(tmppath)
    return not is_insensitive

_IS_CASE_SENSITIVE_FILESYSTEM = is_case_sensitive_filesystem()


def which(program, case_sensitive=_IS_CASE_SENSITIVE_FILESYSTEM):
    """ Simulates unix `which` command. Returns absolute path if program found """
    def is_exe(fpath):
        """ Return true if fpath is a file we have access to that is executable """
        accessmode = os.F_OK | os.X_OK
        if os.path.exists(fpath) and os.access(fpath, accessmode) and not os.path.isdir(fpath):
            filemode = os.stat(fpath).st_mode
            ret = bool(filemode & stat.S_IXUSR or filemode & stat.S_IXGRP or filemode & stat.S_IXOTH)
            return ret

    def list_file_exts(directory, search_filename=None, ignore_case=True):
        """ Return list of (filename, extension) tuples which match the search_filename"""
        if ignore_case:
            search_filename = search_filename.lower()
        for root, dirs, files in os.walk(path):
            for f in files:
                filename, extension = os.path.splitext(f)
                if ignore_case:
                    filename = filename.lower()
                if not search_filename or filename == search_filename:
                    yield (filename, extension)
            break

    fpath, fname = os.path.split(program)

    # is a path: try direct program path
    if fpath:
        if is_exe(program):
            return program
    elif "win" in sys.platform:
        # isnt a path: try fname in current directory on windows
        if is_exe(fname):
            return program

    paths = [path.strip('"') for path in os.environ.get("PATH", "").split(os.pathsep)]
    exe_exts = [ext for ext in os.environ.get("PATHEXT", "").split(os.pathsep)]
    if not case_sensitive:
        exe_exts = map(str.lower, exe_exts)

    # try append program path per directory
    for path in paths:
        exe_file = os.path.join(path, program)
        if is_exe(exe_file):
            return exe_file

    # try with known executable extensions per program path per directory
    for path in paths:
        filepath = os.path.join(path, program)
        for extension in exe_exts:
            exe_file = filepath+extension
            if is_exe(exe_file):
                return exe_file

    # try search program name with "soft" extension search
    if len(os.path.splitext(fname)[1]) == 0:
        for path in paths:
            file_exts = list_file_exts(path, fname, not case_sensitive)
            for file_ext in file_exts:
                filename = "".join(file_ext)
                exe_file = os.path.join(path, filename)
                if is_exe(exe_file):
                    return exe_file

    return None

ব্যবহার এর মতো দেখাচ্ছে:

>>> which.which("meld")
'C:\\Program Files (x86)\\Meld\\meld\\meld.exe'

গৃহীত সমাধান নয়, এই ক্ষেত্রে আমার জন্য কাজ করেনি, যেহেতু ফাইলের মত ছিল meld.1, meld.ico, meld.doap, ইত্যাদি এছাড়াও ডিরেক্টরি, যার মধ্যে এক (lexicographically প্রথম থেকে সম্ভবতঃ) পরিবর্তে ফিরে হয়েছে কারণ গৃহীত উত্তরে এক্সিকিউটেবল পরীক্ষা অসম্পূর্ণ এবং দান ছিল মিথ্যা ইতিবাচক.



2

আমি স্ট্যাকওভারফ্লোতে এমন কিছু পেয়েছি যা আমার জন্য সমস্যার সমাধান করেছে। এটি কার্যকর করে এক্সিকিউটেবলের কাছে একটি বিকল্প রয়েছে (যেমন --help বা --version) যা কিছু আউটপুট করে এবং শূন্যের একটি প্রস্থান স্থিতি দেয়। এক্সিকিউটেবলকে পাইথনের কলগুলিতে দমন আউটপুট দেখুন - এই উত্তরের কোড স্নিপেটের শেষে "ফলাফল" এক্সিকিউটেবলের পথে থাকলে শূন্য হবে, অন্যথায় এটি সম্ভবত 1 হওয়ার সম্ভাবনা রয়েছে।


2

এটি যথেষ্ট সহজ বলে মনে হচ্ছে এবং অজগর 2 এবং 3 তে কাজ করে

try: subprocess.check_output('which executable',shell=True)
except: sys.exit('ERROR: executable not found')

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

1
"কনফিগারেশন প্রয়োজন" বলতে আপনার অর্থ কী? নিজেই 'যা' আসলে কিছু চালায় না তবে কেবল এই নাম (মানুষটি) দ্বারা মৃত্যুদন্ড কার্যকর করার অস্তিত্বের জন্য PATH পরীক্ষা করে।
japap

1
ওহ, সুতরাং আপনি এক্সিকিউটেবলকে খুঁজে পেতে "যা" ব্যবহার করছেন। সুতরাং এটি কেবল লিনাক্স / ইউনিক্সের জন্য কাজ করে?
স্পেজ

1
ব্যবহার command -v executableবা type executableসর্বজনীন হতে। এমন কিছু মামলা রয়েছে যেখানে ম্যাকগুলি প্রত্যাশিত ফলাফল দেয় না।
আরজে

1

একটি গুরুত্বপূর্ণ প্রশ্ন " এক্সিকিউটেবলের অস্তিত্ব থাকলে আপনার কেন পরীক্ষা করা দরকার?" হয়তো আপনি না? ;-)

পিএনজি ফাইলের জন্য দর্শকদের আরম্ভ করার জন্য সম্প্রতি আমার এই কার্যকারিতাটির দরকার ছিল। আমি কিছু পূর্বনির্ধারিত দর্শকদের উপর পুনরাবৃত্তি করতে এবং উপস্থিত থাকা প্রথম চালাতে চেয়েছিলাম। ভাগ্যক্রমে, আমি পেরিয়ে এসেছি os.startfile। এটা অনেক ভালো! সহজ, পোর্টেবল এবং সিস্টেমে ডিফল্ট ভিউয়ার ব্যবহার করে :

>>> os.startfile('yourfile.png')

আপডেট: আমি os.startfileবহনযোগ্য হিসাবে ভুল ছিল ... এটি শুধুমাত্র উইন্ডোজ। ম্যাকে আপনাকে openকমান্ড চালাতে হবে । এবং xdg_openইউনিক্সে। একটা ব্যাপার পাইথন ইস্যু Mac এবং ইউনিক্স জন্য সমর্থন যোগ করার os.startfile



1

যুক্ত উইন্ডোজ সমর্থন

def which(program):
    path_ext = [""];
    ext_list = None

    if sys.platform == "win32":
        ext_list = [ext.lower() for ext in os.environ["PATHEXT"].split(";")]

    def is_exe(fpath):
        exe = os.path.isfile(fpath) and os.access(fpath, os.X_OK)
        # search for executable under windows
        if not exe:
            if ext_list:
                for ext in ext_list:
                    exe_path = "%s%s" % (fpath,ext)
                    if os.path.isfile(exe_path) and os.access(exe_path, os.X_OK):
                        path_ext[0] = ext
                        return True
                return False
        return exe

    fpath, fname = os.path.split(program)

    if fpath:
        if is_exe(program):
            return "%s%s" % (program, path_ext[0])
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            path = path.strip('"')
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return "%s%s" % (exe_file, path_ext[0])
    return None

0

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


0

মনে হবে সুস্পষ্ট পছন্দ "যা", popen মাধ্যমে ফলাফল পার্স, কিন্তু আপনি অন্যথায় অপারেটিং সিস্টেম বর্গ ব্যবহার করে এটি ভান পারে। সিউডোপাইথনে, এটি দেখতে এটির মতো হবে:

for each element r in path:
    for each file f in directory p:
        if f is executable:
           return True

আমি os.exec বা এর মতো কিছু ব্যবহার করে একটি "যা" কমান্ড চালানোর বিষয়ে সতর্কতা অবলম্বন করব। কেবল এটি প্রায়শই ধীর হয় না (যদি পারফরম্যান্স কোনও ধরণের উদ্বেগ হয়) তবে আপনি যদি আপনার এক্সিকিউটিং স্ট্রিংয়ের অংশ হিসাবে কোনও ভেরিয়েবল ব্যবহার করেন তবে সুরক্ষা উদ্বেগ হয়ে যায়। কেউ "আরএম-আরএফ /" ছিঁড়ে যেতে পারে।
পরম্পা

1
কোনটি, যেহেতু আমরা os.popen ফাংশনটি ব্যবহার করে প্রোগ্রাম দ্বারা তৈরি একটি কমান্ড চালাতে চাইছি না, আসলে প্রয়োগ হয় না, না?
চার্লি মার্টিন

2
ধন্যবাদ, তবে আমি নিশ্চিত না যে 'যা' উইন্ডোজ এবং পছন্দগুলিতে বিদ্যমান if আমি মূলত জানতে চেয়েছিলাম
স্ট্যান্ডার্ড লিবে

স্ট্যান্ডার্ড উইন্ডোজ ইনস্টলেশনগুলিতে, এখনও কোনও whichআদেশ নেই; একটি আনেক্সটিল সংস্করণ রয়েছে, তবে আপনাকে অবশ্যই এক্সটেনশনটি জানতে / নির্দিষ্ট করতে হবে, অন্যথায় প্রোগ্রামটি খুঁজে পাওয়া যাবে না।
টোবিয়াস

0

সুতরাং মূলত আপনি মাউন্ট করা ফাইল সিস্টেমে কোনও ফাইল সন্ধান করতে চান (কেবলমাত্র PATH ডিরেক্টরিগুলিতে নয়) এটি পরীক্ষা করতে সক্ষম কিনা তা পরীক্ষা করে দেখতে চান। এটি নিম্নলিখিত পরিকল্পনায় অনুবাদ করে:

  • স্থানীয়ভাবে মাউন্ট করা ফাইল সিস্টেমে সমস্ত ফাইল গণনা করুন
  • নামের প্যাটার্নের সাথে ফলাফলগুলি মেলে
  • প্রতিটি ফাইলের জন্য এটি পরীক্ষা করা যায় কিনা পরীক্ষা করে দেখুন

আমি বলব, পোর্টেবল উপায়ে এটি করার জন্য প্রচুর কম্পিউটিং শক্তি এবং সময় প্রয়োজন। আসলেই কি আপনার যা প্রয়োজন?


0

একটা হল which.py একটি প্রমিত পাইথন বিতরণে স্ক্রিপ্ট (Windows এ যেমন '\PythonXX\Tools\Scripts\which.py')।

সম্পাদনা: which.pyনির্ভর করে lsতাই এটি ক্রস প্ল্যাটফর্ম নয়।


0

পূর্ববর্তী কোনও উদাহরণই সমস্ত প্ল্যাটফর্মে কাজ করে না। সাধারণত তারা উইন্ডোজে কাজ করতে ব্যর্থ হয় কারণ আপনি ফাইল এক্সটেনশন ছাড়াই কার্যকর করতে পারেন এবং আপনি নতুন এক্সটেনশনটি নিবন্ধন করতে পারেন। উদাহরণস্বরূপ উইন্ডোজে অজগরটি যদি ইনস্টল থাকে তবে এটি 'ফাইল.পি' চালানোর পক্ষে যথেষ্ট এবং এটি কাজ করবে।

আমার কাছে কেবল বৈধ এবং পোর্টেবল সমাধান ছিল কমান্ডটি কার্যকর করা এবং ত্রুটি কোডটি দেখা। যে কোনও শালীন এক্সিকিউটেবলের কাছে কলিং পরামিতিগুলির একটি সেট থাকা উচিত যা কিছুই করবে না।


-3

পাইথন ফ্যাব্রিক লাইব্রেরি ব্যবহার:

from fabric.api import *

def test_cli_exists():
    """
    Make sure executable exists on the system path.
    """
    with settings(warn_only=True):
        which = local('which command', capture=True)

    if not which:
        print "command does not exist"

    assert which

2
এটি একটি খুব খারাপ পরামর্শ। আপনি আক্ষরিক অর্থে প্রোগ্রামটিকে স্থানীয় প্রোগ্রাম (যা পাইথন স্টাডলিব সহজেই করতে পারে) তৈরি করতে দূরবর্তী সম্পাদনের লাইব্রেরির উপর নির্ভরশীল করে তুলছেন, এবং অতিরিক্ত হিসাবে, আপনি সমস্ত সিস্টেমে উপস্থিত নেই তার উপর নির্ভরশীল। which(1)
মাইকা গার্নি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.