जवाबों:
साथ -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()'
$python -c "import foo;foo.hello()"
print foo.hello()
साथ बदल print(foo.hello())
दिया। मुझे यह बताने के लिए अजगर ज्ञान नहीं है कि यह क्यों है, इसलिए अगर कोई और समझा सकता है कि क्या हो सकता है, तो इसकी बहुत सराहना की जाएगी
बस hello()
फ़ंक्शन के नीचे कहीं रख दिया और जब आप ऐसा करेंगे तो यह निष्पादित होगाpython your_file.py
एक neater समाधान के लिए आप इसका उपयोग कर सकते हैं:
if __name__ == '__main__':
hello()
इस तरह से फ़ंक्शन केवल तभी निष्पादित होगा जब आप फ़ाइल आयात करते हैं, न कि जब आप फ़ाइल आयात करते हैं।
hello()
तर्क है कि कमांड लाइन द्वारा आपूर्ति की जानी चाहिए?
sys.argv
विधि को भेज सकते हैं । या इसे हैलो विधि से एक्सेस करें
hello()
) को कैसे निष्पादित करूं और इसे कमांड लाइन से चलाऊं ?
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__"
।
python -m foo -c 'foo.bar()'
और python -c 'import foo; foo.bar()'
? मुझे अलग-अलग व्यवहार मिलता है जहाँ ऐसा लगता है कि -c तर्क को पहले मामले में अनदेखा किया जाता है।
मैंने एक त्वरित लिटिल पायथन लिपि लिखी है जो बैश कमांड लाइन से कॉल करने योग्य है। यह उस मॉड्यूल, वर्ग और विधि का नाम लेता है जिसे आप कॉल करना चाहते हैं और जो पैरामीटर आप पास करना चाहते हैं। मैं इसे 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 आपके रास्ते में कहीं भी हो सकता है।
इस स्निपेट को अपनी स्क्रिप्ट के निचले हिस्से में जोड़ें
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)
आइए इसे थोड़ा आसान बनाएं और बस एक मॉड्यूल का उपयोग करें ...
प्रयत्न: 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
python -m fire file_name method_name
:। इसमें एक बिल्ट-इन argparser भी है।
दिलचस्प रूप से पर्याप्त है, अगर लक्ष्य कमांड लाइन कंसोल पर प्रिंट करना था या कुछ अन्य मिनट अजगर ऑपरेशन करना था, तो आप अजगर इंटरप्रेटर में इनपुट डाल सकते हैं:
echo print("hi:)") | python
साथ ही पाइप फाइलें ।।
python < foo.py
* ध्यान दें कि विस्तार के लिए दूसरा काम करने के लिए पर्याप्त नहीं होना चाहिए। ** यह भी ध्यान दें कि चाबुक के लिए आपको पात्रों से बचने की आवश्यकता हो सकती है
echo print\(\"hi:\)\"\) | python
echo import foo;foo.hello() | python
echo 'print("hi:)")' | python
यदि आप रनिंग पैकेज pip install runp
को चलाने के मामले में स्थापित करते हैं :
runp myfile.py hello
आप यहां पर रिपॉजिटरी पा सकते हैं: https://github.com/vascop/runp
मुझे कमांड लाइन पर विभिन्न अजगर उपयोगिताओं (रेंज, स्ट्रिंग, आदि) का उपयोग करने की आवश्यकता थी और विशेष रूप से इसके लिए उपकरण 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
यह हमेशा कमांड पाइथन के साथ कमांड लाइन पर अजगर में प्रवेश करने का एक विकल्प है
फिर अपनी फ़ाइल को आयात करें example_file आयात करें
उसके बाद example_file.hello () के साथ कमांड चलाएँ
यह अजीब .pyc कॉपी फंक्शन से बचता है जो हर बार जब आप अजगर -c आदि चलाते हैं तो फसलें उगाते हैं।
शायद सिंगल-कमांड के रूप में सुविधाजनक नहीं है, लेकिन कमांड लाइन से एक फ़ाइल को टेक्स्ट करने के लिए एक अच्छा त्वरित फिक्स है, और आपको अपनी फ़ाइल को कॉल करने और निष्पादित करने के लिए अजगर का उपयोग करने की अनुमति देता है।
कुछ इस तरह: 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
नीचे 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)" से
धन्यवाद।
पहले आपको फ़ंक्शन को कॉल करना होगा जैसा कि उन्होंने आपको बताया था या फ़ॉउनेशन आउटपुट में कुछ भी प्रदर्शित नहीं करेगा, इसके बाद फ़ाइल को सहेजें और फ़ाइल के फ़ोल्डर पर राइट क्लिक करके फ़ाइल के पथ की प्रतिलिपि बनाएँ और फिर "कॉपी फ़ाइल" पर क्लिक करें। टर्मिनल पर जाएं और लिखें: - cd "फ़ाइल का पथ" - उदाहरण के लिए फ़ाइल का नाम "अजगर" (इसके बाद (मुख्य अंश)) यह आपके कोड के आउटपुट को प्रदर्शित करेगा।
print "Hi :)"
बजाय मतलब थाreturn 'Hi :)'
।