ฉันมีรหัสนี้:
def hello():
return 'Hi :)'
ฉันจะเรียกใช้สิ่งนี้โดยตรงจากบรรทัดคำสั่งได้อย่างไร
ฉันมีรหัสนี้:
def hello():
return 'Hi :)'
ฉันจะเรียกใช้สิ่งนี้โดยตรงจากบรรทัดคำสั่งได้อย่างไร
คำตอบ:
ด้วยอาร์กิวเมนต์-c
(คำสั่ง) (สมมติว่าไฟล์ของคุณมีชื่อfoo.py
):
$ python -c 'import foo; print foo.hello()'
อีกทางเลือกหนึ่งถ้าคุณไม่สนใจมลภาวะของ namespace:
$ 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
จะต้องถูกแทนที่ด้วยชื่อฐานของสคริปต์ Python ของคุณ (เช่นmyfile.py
กลายเป็นmyfile
)
อย่างไรก็ตามหากhello()
เป็นจุดเข้าหลัก "ถาวร" ของคุณในสคริปต์ Python ของคุณวิธีปกติในการทำเช่นนี้มีดังนี้:
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 จะถูกละเว้นในกรณีแรก
ฉันเขียนสคริปต์ Python เล็กน้อยอย่างรวดเร็วที่เรียกได้จากบรรทัดคำสั่ง bash มันใช้ชื่อของโมดูลคลาสและวิธีการที่คุณต้องการโทรและพารามิเตอร์ที่คุณต้องการผ่าน ฉันเรียกมันว่า 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\)
โปรดสังเกตตัวอย่างสุดท้ายของการหลีกเลี่ยงวงเล็บเพื่อส่งผ่านทูเปิลเป็นพารามิเตอร์เดียวไปยังเมธอด Second
หากคุณผ่านพารามิเตอร์น้อยเกินไปสำหรับสิ่งที่วิธีการที่คุณต้องการได้รับข้อผิดพลาด ถ้าคุณผ่านมากเกินไปมันจะไม่สนใจสิ่งที่เพิ่มเข้ามา โมดูลจะต้องอยู่ในโฟลเดอร์การทำงานปัจจุบันทำให้ PyRun สามารถอยู่ที่ใดก็ได้ในเส้นทางของคุณ
เพิ่มตัวอย่างนี้ไปที่ด้านล่างของสคริปต์ของคุณ
def myfunction():
...
if __name__ == '__main__':
globals()[sys.argv[1]]()
ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันของคุณโดยเรียกใช้
python myscript.py myfunction
สิ่งนี้ได้ผลเพราะคุณกำลังส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่ง (สตริงของชื่อฟังก์ชัน) ลงในlocals
พจนานุกรมที่มีตารางสัญลักษณ์โลคอลปัจจุบัน parantheses ที่ส่วนท้ายจะทำให้เรียกใช้ฟังก์ชัน
อัปเดต:หากคุณต้องการให้ฟังก์ชันยอมรับพารามิเตอร์จากบรรทัดคำสั่งคุณสามารถส่งผ่าน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.
หมายเหตุ: มีข้อผิดพลาดใน Python 3 ในขณะนี้ แต่ใช้งานได้ดีกับ Python 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
* โปรดทราบว่าส่วนขยายไม่จำเป็นต้องเป็น. py สำหรับการทำงานครั้งที่สอง ** โปรดทราบด้วยว่าสำหรับทุบตีคุณอาจต้องหลบหนีจากตัวละคร
echo print\(\"hi:\)\"\) | python
echo import foo;foo.hello() | python
echo 'print("hi:)")' | python
หากคุณติดตั้งแพคเกจ runp ด้วย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
เป็นตัวเลือกเสมอในการป้อน python บนบรรทัดคำสั่งด้วยคำสั่งpython
จากนั้นนำเข้าไฟล์ของคุณเพื่อนำเข้า example_file
จากนั้นเรียกใช้คำสั่งด้วยexample_file.hello ()
นี่หลีกเลี่ยงฟังก์ชั่นการคัดลอก. pyc แปลก ๆ ที่ครอบตัดทุกครั้งที่คุณเรียกใช้ python -c เป็นต้น
อาจไม่สะดวกเท่ากับคำสั่งเดียว แต่เป็นการแก้ไขข้อความไฟล์จากบรรทัดคำสั่งอย่างรวดเร็วและช่วยให้คุณใช้ python เพื่อโทรและเรียกใช้ไฟล์ของคุณ
บางสิ่งเช่นนี้: 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")
ตอนนี้การเรียกจาก Command prompt ด้านล่างเป็นตัวเลือกที่ใช้งานได้สำหรับฉัน
ตัวเลือก 1 เส้นทางแบบเต็มของ exe \ python.exe -c "นำเข้า Odd_Even_function; Odd_Even_function.OE (100)"
ตัวเลือก 2 เส้นทางแบบเต็มของ exe \ python.exe -c "จาก Odd_Even_function นำเข้า OE; OE (100)"
ขอบคุณ
ฟังก์ชั่นนี้ไม่สามารถเรียกใช้จากบรรทัดคำสั่งได้เนื่องจากมันจะส่งคืนค่าที่จะไม่สามารถจัดการได้ คุณสามารถลบการส่งคืนและใช้การพิมพ์แทน
ใช้เครื่องมือpython-c ( pip install python-c ) จากนั้นเขียน:
$ python-c foo 'hello()'
หรือในกรณีที่คุณไม่มีชื่อฟังก์ชันที่ขัดแย้งในไฟล์หลามของคุณ
$ python-c 'hello()'
ก่อนอื่นคุณต้องเรียกใช้ฟังก์ชั่นตามที่พวกเขาบอกคุณหรือ founction จะไม่แสดงอะไรเลยในเอาต์พุตหลังจากนั้นให้บันทึกไฟล์และคัดลอกพา ธ ของไฟล์โดยคลิกขวาที่โฟลเดอร์ของไฟล์และคลิกที่ "copy file" ไปที่เทอร์มินัลแล้วเขียน: - cd "พา ธ ของไฟล์" - python "ชื่อของไฟล์เช่น (main.py)" หลังจากนั้นจะแสดงผลลัพธ์ของโค้ดของคุณ
ทำให้ชีวิตของคุณง่ายขึ้นติดตั้ง Spyder เปิดไฟล์ของคุณแล้วเรียกใช้ (คลิกที่ลูกศรสีเขียว) หลังจากนั้นhello()
วิธีการของคุณจะถูกกำหนดและรู้จักกับ IPython Console เพื่อให้คุณสามารถเรียกได้จากคอนโซล
print "Hi :)"
return 'Hi :)'