कमांड लाइन से फंक्शन चलाएं


363

मेरे पास यह कोड है:

def hello():
    return 'Hi :)'

मैं इसे सीधे कमांड लाइन से कैसे चलाऊंगा?


21
शायद आप के print "Hi :)"बजाय मतलब था return 'Hi :)'
तमसा

जवाबों:


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
यदि फ़ाइल स्थानीय निर्देशिका में या PYTHONPATH पर नहीं है तो क्या होगा?
कॉन्स्टेंटिन

2
दूसरा एक अधिक सामान्य उत्तर है। मेरे पास एक स्क्रिप्ट है जो कई ग्राहक कार्यों को परिभाषित करती है, और केवल एक को मेरी जरूरत के आधार पर कॉल करती है
xappppp

1
किसी कारण से, यह मेरे लिए काम नहीं किया, जबकि के print foo.hello()साथ बदल print(foo.hello())दिया। मुझे यह बताने के लिए अजगर ज्ञान नहीं है कि यह क्यों है, इसलिए अगर कोई और समझा सकता है कि क्या हो सकता है, तो इसकी बहुत सराहना की जाएगी
जैस्पर

2
@ आकांक्षा स्पष्टीकरण के लिए धन्यवाद, और यह निश्चित रूप से समझ में आता है। क्या कोष्ठकों को शामिल करने के लिए उत्तर को संपादित करना सही लगता है? अगर मैं गलत नहीं हूँ तो यह अजगर 2 और 3 दोनों के साथ संगत कर देगा। (इस तरह के क्षणों में, मुझे एक संपादित सुझाव देने में सक्षम होना पसंद होगा।)
जस्पर

130

बस hello()फ़ंक्शन के नीचे कहीं रख दिया और जब आप ऐसा करेंगे तो यह निष्पादित होगाpython your_file.py

एक neater समाधान के लिए आप इसका उपयोग कर सकते हैं:

if __name__ == '__main__':
    hello()

इस तरह से फ़ंक्शन केवल तभी निष्पादित होगा जब आप फ़ाइल आयात करते हैं, न कि जब आप फ़ाइल आयात करते हैं।


3
और क्या होगा अगर hello()तर्क है कि कमांड लाइन द्वारा आपूर्ति की जानी चाहिए?
बेनामी

2
उस स्थिति में आप sys.argvविधि को भेज सकते हैं । या इसे हैलो विधि से एक्सेस करें
वोल्फ

3
इस उत्तर और आयात foo समाधान के बीच एक अंतर यह है कि आयात foo फू को संशोधित किए बिना foo में एक मनमाना कार्य करने की अनुमति देता है।
plafratt

यह सच है, लेकिन मैं उस समाधान को परीक्षण के उद्देश्यों से परे नहीं
सुझाऊंगा

इस संरचना के साथ @Wolph हे, मैं एक अलग फ़ंक्शन (अंदर शामिल नहीं 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

मैंने एक त्वरित लिटिल पायथन लिपि लिखी है जो बैश कमांड लाइन से कॉल करने योग्य है। यह उस मॉड्यूल, वर्ग और विधि का नाम लेता है जिसे आप कॉल करना चाहते हैं और जो पैरामीटर आप पास करना चाहते हैं। मैं इसे PyRun कहता हूं और .py एक्सटेंशन को छोड़ देता हूं और इसे chmod + x PyRun के साथ निष्पादन योग्य बनाता हूं ताकि मैं बस इसे जल्दी से कॉल कर सकूं:

./PyRun PyTest.ClassName.Method1 Param1

इसे PyRun नामक फ़ाइल में सहेजें

#!/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)

यह कैसे काम करता है यह दिखाने के लिए यहां एक नमूना मॉड्यूल है। यह PyTest.py नामक एक फ़ाइल में सहेजा गया है:

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\)

दूसरी विधि के लिए एकमात्र पैरामीटर के रूप में टपल में पास होने के लिए कोष्ठक से बचने के अंतिम उदाहरण पर ध्यान दें।

यदि आप इस विधि के लिए बहुत कम पैरामीटर पास करते हैं तो आपको एक त्रुटि प्राप्त करने की आवश्यकता है। यदि आप बहुत से पास करते हैं, तो यह एक्स्ट्रा को नजरअंदाज कर देता है। मॉड्यूल वर्तमान काम करने वाले फ़ोल्डर में होना चाहिए, रखो PyRun आपके रास्ते में कहीं भी हो सकता है।


2
यह अच्छा है, लेकिन यह वास्तव में सवाल का जवाब नहीं है।
फ्रांसिस कोलास

14
क्षमा करें मैं असहमत हूं; यह बिल्कुल सवाल है। उन्होंने पूछा कि आप किसी फ़ाइल से फ़ंक्शन कैसे चलाते हैं और ठीक यही करता है।
जोसेफ गागलियार्डो

क्या आप बता सकते हैं कि cmd_folder के बारे में क्या कर रहे हैं?
रयानडे

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 के साथ बहुत अच्छा काम करता है।

संपादित करें: मेरी राय में एक बेहतर विकल्प, Google द्वारा मॉड्यूल आग है जो फ़ंक्शन तर्कों को भी पास करना आसान बनाता है। इसके साथ स्थापित किया गया है pip install fire। उनके GitHub से:

यहाँ एक सरल उदाहरण है।

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:। इसमें एक बिल्ट-इन argparser भी है।
user3265569

6

दिलचस्प रूप से पर्याप्त है, अगर लक्ष्य कमांड लाइन कंसोल पर प्रिंट करना था या कुछ अन्य मिनट अजगर ऑपरेशन करना था, तो आप अजगर इंटरप्रेटर में इनपुट डाल सकते हैं:

echo print("hi:)") | python

साथ ही पाइप फाइलें ।।

python < foo.py

* ध्यान दें कि विस्तार के लिए दूसरा काम करने के लिए पर्याप्त नहीं होना चाहिए। ** यह भी ध्यान दें कि चाबुक के लिए आपको पात्रों से बचने की आवश्यकता हो सकती है

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

हेलो के साथ foo.py को ध्यान में रखते हुए () उदाहरण है, यह है कि कोई भी इसे उपरोक्त विचार के साथ कैसे उपयोग कर सकता है। echo import foo;foo.hello() | python
अरिंदम रॉयचौधरी

क्या इस पद्धति के साथ कमांड-लाइन तर्कों में पास होने का कोई तरीका है?
स्पार्कडॉन्फ्स

1
FWIW, निम्नलिखित तीसरे उदाहरण के लिए थोड़ा क्लीनर है:echo 'print("hi:)")' | python
user3166580

5

यदि आप रनिंग पैकेज pip install runpको चलाने के मामले में स्थापित करते हैं :

runp myfile.py hello

आप यहां पर रिपॉजिटरी पा सकते हैं: https://github.com/vascop/runp


1
परियोजना अजगर 3 के साथ संगत नहीं है
dim8

4

मुझे कमांड लाइन पर विभिन्न अजगर उपयोगिताओं (रेंज, स्ट्रिंग, आदि) का उपयोग करने की आवश्यकता थी और विशेष रूप से इसके लिए उपकरण pyfunc लिखा था । आप कमांड लाइन उपयोग अनुभव को समृद्ध करने के लिए इसका उपयोग कर सकते हैं:

 $ 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

यह हमेशा कमांड पाइथन के साथ कमांड लाइन पर अजगर में प्रवेश करने का एक विकल्प है

फिर अपनी फ़ाइल को आयात करें example_file आयात करें

उसके बाद example_file.hello () के साथ कमांड चलाएँ

यह अजीब .pyc कॉपी फंक्शन से बचता है जो हर बार जब आप अजगर -c आदि चलाते हैं तो फसलें उगाते हैं।

शायद सिंगल-कमांड के रूप में सुविधाजनक नहीं है, लेकिन कमांड लाइन से एक फ़ाइल को टेक्स्ट करने के लिए एक अच्छा त्वरित फिक्स है, और आपको अपनी फ़ाइल को कॉल करने और निष्पादित करने के लिए अजगर का उपयोग करने की अनुमति देता है।


1

कुछ इस तरह: call_from_terminal.py

# 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 exe \ python.exe -c का पूर्ण पथ "आयात Od__ven_function; Odd_Even_function.OE (100)"

विकल्प 2 exe \ python.exe -c का पूरा रास्ता "Odd_Even_function आयात OE; OE (100)" से

धन्यवाद।


0

यह फ़ंक्शन कमांड लाइन से नहीं चलाया जा सकता है क्योंकि यह एक मान लौटाता है जो बिना रुके चला जाएगा। आप इसके बदले रिटर्न निकाल सकते हैं और प्रिंट का उपयोग कर सकते हैं


-2

पायथन-सी टूल का उपयोग करें ( पाईप पायथन-सी स्थापित करें ) और फिर बस लिखें:

$ python-c foo 'hello()'

या मामले में आप अपने अजगर फ़ाइलों में कोई समारोह नाम संघर्ष है:

$ python-c 'hello()'

-2

पहले आपको फ़ंक्शन को कॉल करना होगा जैसा कि उन्होंने आपको बताया था या फ़ॉउनेशन आउटपुट में कुछ भी प्रदर्शित नहीं करेगा, इसके बाद फ़ाइल को सहेजें और फ़ाइल के फ़ोल्डर पर राइट क्लिक करके फ़ाइल के पथ की प्रतिलिपि बनाएँ और फिर "कॉपी फ़ाइल" पर क्लिक करें। टर्मिनल पर जाएं और लिखें: - cd "फ़ाइल का पथ" - उदाहरण के लिए फ़ाइल का नाम "अजगर" (इसके बाद (मुख्य अंश)) यह आपके कोड के आउटपुट को प्रदर्शित करेगा।


-4

अपने जीवन को आसान बनाएं, स्पाइडर स्थापित करें। अपनी फ़ाइल खोलें फिर इसे चलाएं (हरे तीर पर क्लिक करें)। बाद में आपकी hello()विधि परिभाषित और IPython कंसोल के लिए जानी जाती है, इसलिए आप इसे कंसोल से कॉल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.