581 Stimmen

Funktion über die Befehlszeile ausführen

Ich habe diesen Code:

def hello():
    return 'Hi :)'

Wie kann ich dies direkt von der Befehlszeile aus ausführen?

37voto

Joseph Gagliardo Punkte 713

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.

15voto

Charles Clayton Punkte 15150

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

7voto

Saurabh Hirani Punkte 1100

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

7voto

Torie J Punkte 96

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

6voto

vascop Punkte 4504

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.com

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.

Powered by:

X