কমান্ড লাইন থেকে ফাংশন চালান


363

আমার এই কোডটি রয়েছে:

def hello():
    return 'Hi :)'

কমান্ড লাইন থেকে আমি কীভাবে এটি সরাসরি চালাব?


21
সম্ভবত আপনি এর print "Hi :)"পরিবর্তে বোঝানো হয়েছে return 'Hi :)'
Tamás

উত্তর:


566

সঙ্গে -c (কমান্ড) যুক্তি (অভিমানী আপনার ফাইল নামকরণ করা হয় foo.py):

$ python -c 'import foo; print foo.hello()'

বিকল্পভাবে, আপনি যদি নেমস্পেস দূষণ সম্পর্কে চিন্তা না করেন:

$ python -c 'from foo import *; print hello()'

এবং মাঝের স্থল:

$ python -c 'from foo import hello; print hello()'

32
আমি লক্ষ করেছি যে উইন্ডোজ শেলের উপর আপনার সিঙ্গেলের পরিবর্তে একটি দ্বিগুণ উদ্ধৃতি দরকার। $python -c "import foo;foo.hello()"
অরিন্দম রায়চৌধুরী

6
যদি ফাইলটি স্থানীয় ডিরেক্টরিতে বা পাইথনপথে না থাকে?
কনস্ট্যান্টিন

2
দ্বিতীয়টি আরও সাধারণ উত্তর। আমার কাছে একাধিক গ্রাহকের ফাংশন সংজ্ঞায়িত স্ক্রিপ্ট রয়েছে এবং কেবলমাত্র আমার প্রয়োজনের উপর নির্ভর করে একটি কল করুন
xappppp

1
কিছু কারণে, এটি আমার সাথে কাজ করে না, পরিবর্তে প্রতিস্থাপন print foo.hello()করার সময় print(foo.hello())। কেন এটি হচ্ছে তা ব্যাখ্যা করার জন্য আমার কাছে অজগর সম্পর্কিত জ্ঞান নেই, সুতরাং যদি কেউ অন্য কী ঘটছে তা ব্যাখ্যা করতে পারে, তবে এটির প্রশংসা হবে
জেস্পার

2
@ আকঙ্কা ব্যাখ্যাটির জন্য ধন্যবাদ, এবং এটি অবশ্যই উপলব্ধি করে। প্রথম বন্ধনী অন্তর্ভুক্ত করার জন্য উত্তরটি সম্পাদনা করা কি ঠিক বলে মনে হচ্ছে? যদি এটি ভুল না হয় তবে এটি অজগর 2 এবং 3 উভয়ের সাথেই সামঞ্জস্য করবে। (এর মতো মুহুর্তগুলিতে, আমি একটি সম্পাদনার পরামর্শ দিতে সক্ষম হতে চাইতাম))
জ্যাস্পার

130

কেবল hello()ফাংশনটির নীচে কোথাও রেখে দিন এবং এটি কার্যকর করলে এটি কার্যকর হবেpython your_file.py

একটি পরিষ্কার সমাধানের জন্য আপনি এটি ব্যবহার করতে পারেন:

if __name__ == '__main__':
    hello()

আপনি যদি ফাইলটি চালনা করেন কেবল তখনই ফাংশনটি কার্যকর করা হবে, আপনি যখন ফাইলটি আমদানি করবেন না।


3
এবং যদি hello()কমান্ড লাইন দ্বারা সরবরাহ করা উচিত যে যুক্তি গ্রহণ করে?
বেনামে

2
sys.argvসেক্ষেত্রে আপনি পদ্ধতিতে পাঠাতে পারেন । বা হ্যালো পদ্ধতি থেকে এটি অ্যাক্সেস করুন
ওল্ফ

3
এই উত্তর এবং আমদানি foo সমাধানের মধ্যে একটি পার্থক্য হ'ল আমদানি foo foo পরিবর্তন না করেই foo এ একটি স্বেচ্ছাসেবী ফাংশন কল করতে দেয়।
plafratt

এটি সত্য, তবে আমি পরীক্ষার উদ্দেশ্যগুলি ছাড়িয়ে সেই সমাধানটির প্রস্তাব দেব না
ওল্ফ

@ ওল্ফ হে এই কাঠামোর সাথে, আমি কীভাবে একটি পৃথক কার্য সম্পাদন করব (ভিতরে অন্তর্ভুক্ত নয় hello()) এবং কমান্ড লাইন থেকে এটি চালাবো?
সৌভিক রায়

66

python -c 'from myfile import hello; hello()'যেখানে myfileআপনার পাইথন স্ক্রিপ্টের বেসনাম দিয়ে প্রতিস্থাপন করতে হবে। (যেমন, myfile.pyহয়ে যায় myfile)।

তবে, যদি hello()আপনার পাইথন স্ক্রিপ্টে আপনার "স্থায়ী" প্রধান এন্ট্রি পয়েন্ট হয়, তবে এটি করার স্বাভাবিক উপায়টি নিম্নরূপ:

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

এটি আপনাকে কেবল চালানো python myfile.pyবা দ্বারা স্ক্রিপ্টটি সম্পাদন করতে দেয় python -m myfile

এখানে কিছু ব্যাখ্যা: __name__একটি বিশেষ পাইথন পরিবর্তনশীল যে মডিউল নাম বর্তমানে মৃত্যুদন্ড কার্যকর করা হচ্ছে ঝুলিতে ব্যতীত যখন মডিউল কমান্ড লাইন, যে ক্ষেত্রে এটা হয়ে থেকে শুরু হয় "__main__"


2
মধ্যে পার্থক্য কি python -m foo -c 'foo.bar()'এবং python -c 'import foo; foo.bar()'? আমি আলাদা আচরণ পেয়েছি যেখানে মনে হয় -C যুক্তি প্রথম ক্ষেত্রে অগ্রাহ্য করা হয়েছে।
আব্রাম

29

আমি একটি দ্রুত ছোট পাইথন স্ক্রিপ্ট লিখেছি যা ব্যাশ কমান্ড লাইন থেকে কলযোগ্য। এটি আপনাকে যে মডিউল, শ্রেণি এবং পদ্ধতিতে কল করতে চান এবং যে পরামিতিগুলি আপনি পাস করতে চান তার নাম নেয়। আমি এটিকে পাইআরুন বলেছি এবং .py এক্সটেনশনটি ছেড়ে দিয়েছি এবং chmod + x পাইরুন দিয়ে এটি সম্পাদনযোগ্য করে তুলেছি যাতে আমি কেবল এটি অনুসরণ করে দ্রুত কল করতে পারি:

./PyRun PyTest.ClassName.Method1 Param1

এটি পাইরুন নামক একটি ফাইলে সংরক্ষণ করুন

#!/usr/bin/env python
#make executable in bash chmod +x PyRun

import sys
import inspect
import importlib
import os

if __name__ == "__main__":
    cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
    if cmd_folder not in sys.path:
        sys.path.insert(0, cmd_folder)

    # get the second argument from the command line      
    methodname = sys.argv[1]

    # split this into module, class and function name
    modulename, classname, funcname = methodname.split(".")

    # get pointers to the objects based on the string names
    themodule = importlib.import_module(modulename)
    theclass = getattr(themodule, classname)
    thefunc = getattr(theclass, funcname)

    # pass all the parameters from the third until the end of 
    # what the function needs & ignore the rest
    args = inspect.getargspec(thefunc)
    z = len(args[0]) + 2
    params=sys.argv[2:z]
    thefunc(*params)

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

class SomeClass:
 @staticmethod
 def First():
     print "First"

 @staticmethod
 def Second(x):
    print(x)
    # for x1 in x:
    #     print x1

 @staticmethod
 def Third(x, y):
     print x
     print y

class OtherClass:
    @staticmethod
    def Uno():
        print("Uno")

এই উদাহরণগুলি চালনার চেষ্টা করুন:

./PyRun PyTest.SomeClass.First
./PyRun PyTest.SomeClass.Second Hello
./PyRun PyTest.SomeClass.Third Hello World
./PyRun PyTest.OtherClass.Uno
./PyRun PyTest.SomeClass.Second "Hello"
./PyRun PyTest.SomeClass.Second \(Hello, World\)

দ্বিতীয় পদ্ধতির একমাত্র প্যারামিটার হিসাবে টিউপলে পাস করার জন্য প্রথম বন্ধন থেকে বেরিয়ে যাওয়ার শেষ উদাহরণটি লক্ষ্য করুন।

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


2
এটি দুর্দান্ত, তবে এটি আসলে প্রশ্নের উত্তর নয়।
ফ্রান্সিস কোলাস

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

আপনি কি ব্যাখ্যা করতে পারবেন যে সেমিডি_ফোল্ডারটি কি করছে?
রায়ানডে

26

আপনার স্ক্রিপ্টের নীচে এই স্নিপেট যুক্ত করুন

def myfunction():
    ...


if __name__ == '__main__':
    globals()[sys.argv[1]]()

আপনি এখন চালিয়ে আপনার ফাংশন কল করতে পারেন

python myscript.py myfunction

এটি কাজ করে কারণ আপনি কমান্ড লাইন আর্গুমেন্টটি (ফাংশনটির নামের একটি স্ট্রিং) locals, বর্তমান স্থানীয় প্রতীক টেবিল সহ একটি অভিধানে পাস করছেন । শেষে প্যারান্থেসিসগুলি ফাংশনটি কল করা হবে।

আপডেট: আপনি যদি কমান্ড লাইন থেকে কোনও পরামিতিটি ফাংশনটি স্বীকার করতে চান তবে আপনি এইভাবে পাস করতে পারেন sys.argv[2]:

def myfunction(mystring):
    print mystring


if __name__ == '__main__':
    globals()[sys.argv[1]](sys.argv[2])

এইভাবে, চলমান python myscript.py myfunction "hello"আউটপুট হবে hello


এই পদ্ধতির পক্ষে ফাংশনটির জন্য কোনও পরামিতি গ্রহণ করা সম্ভব? যেমনmyfunction(12)
মেজর মেজর

@ মাজোরমজর আমি কীভাবে এটি করব তা অন্তর্ভুক্ত করার জন্য উত্তরটি আপডেট করেছি
নোয়াম হ্যাকার

লাইভ প্রযোজনায় এটি কি কোনও বিপদ? এটি ইউনিট পরীক্ষা হিসাবে তৈরি করতে চান।
আর্ধি

9

আসুন আমরা এটিকে কিছুটা সহজ করি এবং কেবল একটি মডিউল ব্যবহার করি ...

চেষ্টা করুন: pip install compago

তারপর লিখ:

import compago
app = compago.Application()

@app.command
def hello():
    print "hi there!"

@app.command
def goodbye():
    print "see ya later."

if __name__ == "__main__":
    app.run()

তারপরে যেমন ব্যবহার করুন:

$ python test.py hello
hi there!

$ python test.py goodbye
see ya later.

দ্রষ্টব্য: এই মুহূর্তে পাইথন 3 এ একটি বাগ রয়েছে তবে পাইথন 2 দিয়ে দুর্দান্ত কাজ করে।

সম্পাদনা: এর চেয়েও ভাল বিকল্প, আমার মতে গুগলের মডিউল ফায়ার যা ফাংশন আর্গুমেন্টগুলি পাস করাও সহজ করে তোলে। এটি ইনস্টল করা আছে pip install fire। তাদের গিটহাব থেকে:

এখানে একটি সহজ উদাহরণ।

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

তারপরে, কমান্ড লাইন থেকে, আপনি চালাতে পারেন:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

+1 টি। ফায়ার এমনকি একটি উপায় স্ক্রিপ্ট পরিবর্তন না করে একটি ফাংশন কল করার আছে: python -m fire file_name method_name। এটি একটি অন্তর্নির্মিত আরগপারসারও রয়েছে।
ব্যবহারকারী 3265569

6

আকর্ষণীয়ভাবে যথেষ্ট, যদি লক্ষ্যটি ছিল কমান্ড লাইন কনসোলে মুদ্রণ করা বা অন্য কোনও মিনিট অজগর অপারেশন করা, আপনি পাইথন ইন্টারপ্রেটারের মতো ইনপুটটি পাইপ করতে পারেন:

echo print("hi:)") | python

পাইপ ফাইল হিসাবে ..

python < foo.py

* নোট করুন যে দ্বিতীয়টি কাজ করার জন্য এক্সটেনশনটি .py হওয়া দরকার না। ** এও নোট করুন যে ব্যাশের জন্য আপনাকে অক্ষরগুলি থেকে বাঁচতে হতে পারে

echo print\(\"hi:\)\"\) | python

হ্যালো () উদাহরণ সহ foo.py বিবেচনা করে, উপরের ধারণা দিয়ে কেউ এটি ব্যবহার করতে পারেন। echo import foo;foo.hello() | python
অরিন্দম রায়চৌধুরী

এই পদ্ধতিতে কমান্ড-লাইন আর্গুমেন্টে পাস করার কোনও উপায় আছে কি?
sparkonhdfs

1
এফডাব্লুআইডাব্লু, নিম্নলিখিতটি তৃতীয় উদাহরণের জন্য সামান্য পরিচ্ছন্ন:echo 'print("hi:)")' | python
ব্যবহারকারী 3166580

5

আপনি যদি রানপ প্যাকেজটি pip install runpচালানোর বিষয়টি ইনস্টল করেন :

runp myfile.py hello

আপনি সংগ্রহস্থলটি এখানে পেতে পারেন: https://github.com/vascop/runp


1
পাইথন 3 এর সাথে প্রকল্পটি সামঞ্জস্যপূর্ণ নয়
ডিএম 8

4

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

 $ pyfunc -m range -a 1 7 2
 1
 3
 5

 $ pyfunc -m string.upper -a test
 TEST

 $ pyfunc -m string.replace -a 'analyze what' 'what' 'this'
 analyze this

1

কমান্ড পাইথনের সাথে কমান্ড লাইনে অজগর প্রবেশ করা সর্বদা একটি বিকল্প

তারপরে আপনার ফাইলটি আমদানি করুন উদাহরণস্বরূপ আমদানি করুন ile

তারপরে কমান্ডটি example_file.hello () দিয়ে চালান

এটি অদ্ভুত। পিসিপি অনুলিপি ফাংশন এড়িয়ে যায় যা প্রতিবার অজগর-সি ইত্যাদি চালানোর সময় উত্পন্ন হয় crops

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


1

এর মতো কিছু: কল_ফ্রম_টার্মিনাল.পি

# call_from_terminal.py
# Ex to run from terminal
# ip='"hi"'
# python -c "import call_from_terminal as cft; cft.test_term_fun(${ip})"
# or
# fun_name='call_from_terminal'
# python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
def test_term_fun(ip):
    print ip

এটি ব্যাশে কাজ করে।

$ ip='"hi"' ; fun_name='call_from_terminal' 
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi

1

নীচে Odd_Even_function.py ফাইল যা ফাংশন সংজ্ঞা আছে।

def OE(n):
    for a in range(n):
        if a % 2 == 0:
            print(a)
        else:
            print(a, "ODD")

এখন নীচের কমান্ড প্রম্পট থেকে একই কল করতে আমার পক্ষে কাজ করা বিকল্পগুলি রয়েছে।

বিকল্পগুলির 1 এক্সের সম্পূর্ণ পথ \ পাইথন.এক্সএইসি -c "আমদানি ওড_ইভেন_ফংশন; ওড_এভেন_ফানশন.ওই (100)"

বিকল্প 2 অপডের সম্পূর্ণ পথ \ পাইথন.এক্সই-সি "ওড_এভেন_ফংশন আমদানি OE; ওই (100)"

ধন্যবাদ।


0

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


-2

পাইথন-সি সরঞ্জামটি ব্যবহার করুন ( পাইপ ইনস্টল পাইথন-সি ) এবং তারপরে সহজভাবে লিখুন:

$ python-c foo 'hello()'

অথবা আপনার অজগর ফাইলগুলিতে কোনও ফাংশন নাম সংঘর্ষ না ঘটলে:

$ python-c 'hello()'

-2

প্রথমে আপনাকে ফাংশনটি কল করতে হবে যেমন তারা আপনাকে বলেছিল বা ফাউঞ্চ আউটপুটে কিছুই প্রদর্শন করবে না, তারপরে ফাইলটি সংরক্ষণ করুন এবং ফাইলটির ফোল্ডারে ডান ক্লিক করে অনুলিপি করুন এবং "অনুলিপি ফাইল" ক্লিক করুন তারপরে টার্মিনালে যান এবং লিখুন: - সিডি "ফাইলের পথ" - পাইথন "উদাহরণস্বরূপ ফাইলের নাম (main.py)" এর পরে এটি আপনার কোডের আউটপুট প্রদর্শন করবে display


-4

আপনার জীবনকে আরও সহজ করুন, স্পাইডার ইনস্টল করুন। আপনার ফাইলটি খুলুন তারপর এটি চালান (সবুজ তীরটি ক্লিক করুন)। এরপরে আপনার hello()পদ্ধতিটি সংজ্ঞায়িত হয়ে আইপিথন কনসোলের কাছে পরিচিত, যাতে আপনি এটি কনসোল থেকে কল করতে পারেন।

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