Jawaban:
Dengan argumen -c
(perintah) (dengan asumsi file Anda bernama foo.py
):
$ python -c 'import foo; print foo.hello()'
Atau, jika Anda tidak peduli dengan polusi namespace:
$ python -c 'from foo import *; print hello()'
Dan jalan tengah:
$ python -c 'from foo import hello; print hello()'
$python -c "import foo;foo.hello()"
print foo.hello()
dengan print(foo.hello())
. Saya tidak memiliki pengetahuan python untuk menjelaskan mengapa ini terjadi, jadi jika orang lain dapat menjelaskan apa yang sedang terjadi, itu akan sangat dihargai
Cukup letakkan di hello()
suatu tempat di bawah fungsi dan itu akan dijalankan ketika Anda melakukannyapython your_file.py
Untuk solusi yang lebih rapi, Anda dapat menggunakan ini:
if __name__ == '__main__':
hello()
Dengan begitu fungsi hanya akan dieksekusi jika Anda menjalankan file, bukan ketika Anda mengimpor file.
hello()
mengambil argumen yang harus disediakan oleh baris perintah?
sys.argv
ke metode. Atau akses dari metode halo
hello()
) dan menjalankannya dari baris perintah?
python -c 'from myfile import hello; hello()'
di mana myfile
harus diganti dengan nama sandi skrip Python Anda. (Misalnya, myfile.py
menjadi myfile
).
Namun, jika hello()
titik masuk utama "permanen" Anda dalam skrip Python Anda, maka cara biasa untuk melakukan ini adalah sebagai berikut:
def hello():
print "Hi :)"
if __name__ == "__main__":
hello()
Ini memungkinkan Anda untuk menjalankan skrip hanya dengan menjalankan python myfile.py
atau python -m myfile
.
Beberapa penjelasan di sini: __name__
adalah variabel Python khusus yang menyimpan nama modul yang sedang dieksekusi, kecuali ketika modul dimulai dari baris perintah, dalam hal ini menjadi "__main__"
.
python -m foo -c 'foo.bar()'
dan python -c 'import foo; foo.bar()'
? Saya mendapatkan perilaku yang berbeda di mana tampaknya argumen -c diabaikan dalam kasus pertama.
Saya menulis skrip Python kecil cepat yang dapat dipanggil dari baris perintah bash. Dibutuhkan nama modul, kelas dan metode yang ingin Anda panggil dan parameter yang ingin Anda sampaikan. Saya menyebutnya PyRun dan meninggalkan ekstensi .py dan membuatnya dieksekusi dengan chmod + x PyRun sehingga saya bisa memanggilnya dengan cepat sebagai berikut:
./PyRun PyTest.ClassName.Method1 Param1
Simpan ini dalam file yang disebut 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)
Berikut adalah contoh modul untuk menunjukkan cara kerjanya. Ini disimpan dalam file bernama 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")
Coba jalankan contoh-contoh ini:
./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\)
Perhatikan contoh terakhir melarikan diri tanda kurung untuk lulus dalam tuple sebagai satu-satunya parameter untuk metode Kedua.
Jika Anda melewatkan terlalu sedikit parameter untuk metode apa yang Anda butuhkan, Anda mendapatkan kesalahan. Jika Anda melewati terlalu banyak, ia mengabaikan ekstra. Modul harus berada di folder saat ini, menempatkan PyRun bisa di mana saja di jalur Anda.
tambahkan potongan ini ke bagian bawah skrip Anda
def myfunction():
...
if __name__ == '__main__':
globals()[sys.argv[1]]()
Anda sekarang dapat memanggil fungsi Anda dengan menjalankan
python myscript.py myfunction
Ini berfungsi karena Anda meneruskan argumen baris perintah (string nama fungsi) ke locals
, kamus dengan tabel simbol lokal saat ini. Tanda kurung pada akhirnya akan membuat fungsi dipanggil.
pembaruan: jika Anda ingin fungsi menerima parameter dari baris perintah, Anda bisa masuk sys.argv[2]
seperti ini:
def myfunction(mystring):
print mystring
if __name__ == '__main__':
globals()[sys.argv[1]](sys.argv[2])
Dengan cara ini, menjalankan python myscript.py myfunction "hello"
akan menghasilkan hello
.
myfunction(12)
Mari kita buat ini sedikit lebih mudah pada diri kita dan cukup gunakan modul ...
Mencoba: pip install compago
Lalu menulis:
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()
Kemudian gunakan seperti ini:
$ python test.py hello
hi there!
$ python test.py goodbye
see ya later.
Catatan: Ada bug di Python 3 saat ini, tetapi berfungsi baik dengan Python 2.
Sunting: Pilihan yang lebih baik lagi, menurut saya adalah modul fire oleh Google yang membuatnya mudah untuk meneruskan argumen fungsi. Itu diinstal dengan pip install fire
. Dari GitHub mereka:
Ini contoh sederhana.
import fire
class Calculator(object):
"""A simple calculator class."""
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
Kemudian, dari baris perintah, Anda dapat menjalankan:
python calculator.py double 10 # 20
python calculator.py double --number=15 # 30
python -m fire file_name method_name
. Ini juga memiliki argparser bawaan.
Cukup menarik, jika tujuannya adalah untuk mencetak ke konsol baris perintah atau melakukan beberapa operasi python menit lainnya, Anda dapat menyalurkan input ke interpreter python seperti:
echo print("hi:)") | python
serta file pipa ..
python < foo.py
* Perhatikan bahwa ekstensi tidak harus .py agar yang kedua berfungsi. ** Juga perhatikan bahwa untuk bash Anda mungkin perlu melarikan diri dari karakter
echo print\(\"hi:\)\"\) | python
echo import foo;foo.hello() | python
echo 'print("hi:)")' | python
Jika Anda menginstal paket runp dengan pip install runp
masalah menjalankan:
runp myfile.py hello
Anda dapat menemukan repositori di: https://github.com/vascop/runp
Saya memiliki persyaratan untuk menggunakan berbagai utilitas python (rentang, string, dll.) Pada baris perintah dan telah menulis alat pyfunc khusus untuk itu. Anda dapat menggunakannya untuk memperkaya pengalaman penggunaan baris perintah Anda:
$ 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
Itu selalu merupakan opsi untuk memasukkan python di baris perintah dengan perintah python
kemudian impor file Anda jadi impor example_file
kemudian jalankan perintah dengan example_file.hello ()
Ini menghindari fungsi .pyc copy aneh yang muncul setiap kali Anda menjalankan python -c dll.
Mungkin tidak semudah perintah tunggal, tetapi perbaikan cepat yang baik untuk teks file dari baris perintah, dan memungkinkan Anda untuk menggunakan python untuk memanggil dan mengeksekusi file Anda.
Sesuatu seperti ini: 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
Ini bekerja di bash.
$ ip='"hi"' ; fun_name='call_from_terminal'
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi
Di bawah ini adalah file Odd_Even_function.py yang memiliki definisi fungsi.
def OE(n):
for a in range(n):
if a % 2 == 0:
print(a)
else:
print(a, "ODD")
Sekarang untuk memanggil yang sama dari Command prompt di bawah ini adalah opsi yang berfungsi untuk saya.
Opsi 1 Path lengkap dari exe \ python.exe -c "import Odd_Even_function; Odd_Even_function.OE (100)"
Opsi 2 Path lengkap exe \ python.exe -c "dari Odd_Even_function import OE; OE (100)"
Terima kasih.
Pertama, Anda harus memanggil fungsi seperti yang mereka katakan atau fungsi tidak akan menampilkan apa pun di output, setelah itu simpan file dan salin path file dengan klik kanan ke folder file dan klik "copy file" lalu buka terminal dan tulis: - cd "path file" - python "nama file misalnya (main.py)" setelah itu akan menampilkan output dari kode Anda.
print "Hi :)"
bukanreturn 'Hi :)'
.