Ich habe diesen Code:
def hello():
return 'Hi :)'
Wie kann ich dies direkt von der Befehlszeile aus ausführen?
Ich habe diesen Code:
def hello():
return 'Hi :)'
Wie kann ich dies direkt von der Befehlszeile aus ausführen?
Ich habe ein schnelles kleines Python-Skript geschrieben, das von einer Bash-Befehlszeile aus aufgerufen werden kann. Es benötigt den Namen des Moduls, der Klasse und der Methode, die Sie aufrufen wollen, sowie die Parameter, die Sie übergeben wollen. Ich nenne es PyRun und habe die .py-Erweiterung weggelassen und es mit chmod +x PyRun ausführbar gemacht, so dass ich es einfach schnell wie folgt aufrufen kann:
./PyRun PyTest.ClassName.Method1 Param1
Speichern Sie dies in einer Datei namens 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)
Hier ist ein Beispielmodul, das zeigt, wie es funktioniert. Dieses wird in einer Datei namens PyTest.py gespeichert:
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")
Probieren Sie diese Beispiele aus:
./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\)
Beachten Sie das letzte Beispiel, in dem die Klammern durchbrochen werden, um ein Tupel als einzigen Parameter an die Methode Second zu übergeben.
Wenn Sie zu wenige Parameter für die Anforderungen der Methode übergeben, erhalten Sie einen Fehler. Wenn Sie zu viele übergeben, werden die zusätzlichen Parameter ignoriert. Das Modul muss sich im aktuellen Arbeitsordner befinden, PyRun kann sich an einer beliebigen Stelle in Ihrem Pfad befinden.
Machen wir es uns ein wenig einfacher und verwenden wir einfach ein Modul...
Versuchen Sie es: pip install compago
Dann schreiben Sie:
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()
Dann verwenden Sie wie folgt:
$ python test.py hello
hi there!
$ python test.py goodbye
see ya later.
Hinweis: Es gibt eine Fehler in Python 3 im Moment, funktioniert aber gut mit Python 2.
Editar: Eine noch bessere Option ist meiner Meinung nach das Modul Feuer von Google, die es einfach macht, auch Funktionsargumente zu übergeben. Es wird installiert mit pip install fire
. Von ihrem GitHub:
Hier ist ein einfaches Beispiel.
import fire
class Calculator(object):
"""A simple calculator class."""
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
Dann können Sie in der Befehlszeile Folgendes ausführen:
python calculator.py double 10 # 20
python calculator.py double --number=15 # 30
Ich hatte die Anforderung, verschiedene Python-Hilfsprogramme (range, string, etc.) auf der Kommandozeile zu verwenden und hatte das Tool pyfunc speziell für diesen Zweck. Sie können es verwenden, um Ihre Erfahrungen mit der Kommandozeile zu erweitern:
$ 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
Interessanterweise kann man, wenn man auf die Kommandozeilenkonsole ausgeben oder eine andere winzige Python-Operation durchführen möchte, die Eingabe in den Python-Interpreter wie folgt leiten:
echo print("hi:)") | python
sowie Rohrdateien
python < foo.py
*Beachten Sie, dass die Erweiterung nicht .py sein muss, damit die zweite funktioniert. **Beachten Sie auch, dass Sie für die Bash die Zeichen escapen müssen
echo print\(\"hi:\)\"\) | python
Wenn Sie das runp-Paket mit pip install runp
es ist eine Frage des Laufens:
runp myfile.py hello
Sie finden das Repository unter: https://github.com/vascop/runp
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.