সাবপ্রসেস পপেন এবং কলের মধ্যে পার্থক্য কী (আমি কীভাবে সেগুলি ব্যবহার করতে পারি)?


178

আমি পাইথন থেকে একটি বাহ্যিক প্রোগ্রাম কল করতে চাই। আমি উভয় ব্যবহার করেছি Popen()এবং call()এটি করতে।

দুজনের মধ্যে পার্থক্য কী?

আমার নির্দিষ্ট লক্ষ্য পাইথন থেকে নিম্নলিখিত কমান্ডটি চালানো। পুনঃনির্দেশ কীভাবে কাজ করে তা আমি নিশ্চিত নই।

./my_script.sh > output

আমি ডকুমেন্টেশন পড়েছি এবং এটি বলে যে call()এটি একটি সুবিধাজনক ফাংশন বা শর্টকাট ফাংশন। আমরা কি এর call()পরিবর্তে ব্যবহার করে কোনও শক্তি হারাব Popen()?


ডকুমেন্টেশনের কোন অংশ আপনাকে বিভ্রান্ত করেছে? সংজ্ঞাটি call()খুব পরিষ্কার বলে মনে হচ্ছে। আপনি কি একটি উদ্ধৃতি বা একটি লিঙ্ক সরবরাহ করতে পারেন যাতে একটি উত্তরে কী ফোকাস করতে হয় তা আমরা জানি?
এস .লট

উত্তর:


265

পুনঃনির্দেশ করার জন্য দুটি উপায় রয়েছে। উভয়ই হয় প্রয়োগ হয় subprocess.Popenবা হয় subprocess.call

  1. কীওয়ার্ড আর্গুমেন্টটি সেট করুন shell = Trueবা executable = /path/to/the/shellআপনার কাছে যেমন কমান্ড রয়েছে তেমন নির্দিষ্ট করে দিন।

  2. যেহেতু আপনি কেবলমাত্র একটি ফাইলে আউটপুট পুনর্নির্দেশ করছেন, মূলশব্দটি যুক্তিটি সেট করুন

    stdout = an_open_writeable_file_object

    যেখানে বস্তুটি outputফাইলটির দিকে নির্দেশ করে।

subprocess.Popenতুলনায় আরও সাধারণ subprocess.call

Popenবাধা দেয় না, প্রক্রিয়াটি চলাকালীন আপনার সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয় বা আপনার পাইথন প্রোগ্রামে অন্য জিনিসগুলি দিয়ে চালিয়ে যায়। Popenকোনও Popenবস্তুর ফেরতের কল ।

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

returncode = call(*args, **kwargs) 

মূলত আহ্বানের মতোই

returncode = Popen(*args, **kwargs).wait()

callশুধুমাত্র একটি সুবিধা ফাংশন। সিপিথনে এটি প্রয়োগ হচ্ছে সাবপ্রসেসে.পি :

def call(*popenargs, timeout=None, **kwargs):
    """Run command with arguments.  Wait for command to complete or
    timeout, then return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])
    """
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

আপনি দেখতে পাচ্ছেন, এটি চারপাশে একটি পাতলা মোড়ক Popen


17
মূলত পপেন এবং কল হ'ল লিনাক্স কমান্ড পরিচালিত যথাক্রমে অ্যাসিনক্রোনাস এবং সিঙ্ক্রোনাস ফাংশন।
ব্যবহারকারী 3016020

1
পপেন ব্যবহারের সুবিধা কী? ডাকা প্রোগ্রামটি শেষ না হওয়া পর্যন্ত অপেক্ষা করা কি নিরাপদ হবে না?
টম

4
@ টম প্রায়শই না। আপনি যদি কিছু আউটপুট পড়তে চান, তবে প্রোগ্রামটিতে আরও ইনপুট প্রেরণ করুন, আরও আউটপুট পড়ুন যা সেই ইনপুট থেকে আসে, পুনরায়?
agf

@ ব্যবহারকারী 3016020 আমি ধরে নিই এটি উইন্ডোজ কমান্ডের ক্ষেত্রেও প্রযোজ্য? রাইট?
domih

7

অন্য উত্তরটি খুব সম্পূর্ণ, তবে এখানে একটি নিয়মের থাম্ব রয়েছে:

  • call ব্লক করা হচ্ছে:

    call('notepad.exe')
    print('hello')  # only executed when notepad is closed
    
  • Popen অ-অবরুদ্ধ:

    Popen('notepad.exe')
    print('hello')  # immediately executed
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.