it-swarm.com.de

Führen Sie die Funktion über die Befehlszeile aus

Ich habe diesen Code:

def hello():
    return 'Hi :)'

Wie würde ich das direkt von der Kommandozeile ausführen?

305
Steven

Mit dem Argument -c(Befehl) (vorausgesetzt, Ihre Datei heißt foo.py):

$ python -c 'import foo; print foo.hello()'

Wenn Ihnen die Namespace-Verschmutzung nicht wichtig ist:

$ python -c 'from foo import *; print hello()'

Und der Mittelweg:

$ python -c 'from foo import hello; print hello()'
480

Setzen Sie einfach hello() irgendwo unter die Funktion, und sie wird ausgeführt, wenn Sie python your_file.py ausführen.

Für eine übersichtlichere Lösung können Sie Folgendes verwenden:

if __== '__main__':
    hello()

Auf diese Weise wird die Funktion nur ausgeführt, wenn Sie die Datei ausführen, nicht wenn Sie die Datei importieren.

117
Wolph

python -c 'from myfile import hello; hello()' wobei myfile durch den Basisnamen Ihres Python Skripts ersetzt werden muss. (Zum Beispiel wird myfile.pymyfile).

Wenn jedoch hello() Ihr "dauerhafter" Haupteinstiegspunkt in Ihrem Python -Skript ist, geschieht dies normalerweise folgendermaßen:

def hello():
    print "Hi :)"

if __== "__main__":
    hello()

Auf diese Weise können Sie das Skript einfach ausführen, indem Sie python myfile.py oder python -m myfile ausführen.

Hier einige Erklärungen: __name__ ist eine spezielle Python -Variable, die den Namen des gerade ausgeführten Moduls enthält , mit Ausnahme von . Wenn das Modul über die Befehlszeile gestartet wird, wird es zu "__main__".

52
Tamás

Ich habe ein kurzes kleines Python Skript geschrieben, das über eine Bash-Befehlszeile aufgerufen werden kann. Es enthält den Namen des Moduls, der Klasse und der Methode, die Sie aufrufen möchten, sowie die Parameter, die Sie übergeben möchten. 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 __== "__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, um zu zeigen, wie es funktioniert. Dies 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")

Führen Sie die folgenden 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, bei dem die Klammern maskiert werden, um ein Tupel als einzigen Parameter an die Second-Methode zu übergeben.

Wenn Sie zu wenige Parameter für die von der Methode benötigten übergeben, wird eine Fehlermeldung ausgegeben. Übergeben Sie zu viele, werden die Extras ignoriert. Das Modul muss sich im aktuellen Arbeitsordner befinden, PyRun kann sich an einer beliebigen Stelle in Ihrem Pfad befinden.

24

fügen Sie dieses Snippet am Ende Ihres Skripts hinzu

def myfunction():
    ...


if __== '__main__':
    globals()[sys.argv[1]]()

Sie können Ihre Funktion jetzt aufrufen, indem Sie ausführen

python myscript.py myfunction

Dies funktioniert, weil Sie das Befehlszeilenargument (eine Zeichenfolge des Funktionsnamens) an locals übergeben, ein Wörterbuch mit einer aktuellen lokalen Symboltabelle. Die Klammern am Ende bewirken, dass die Funktion aufgerufen wird.

pdate: Wenn Sie möchten, dass die Funktion einen Parameter von der Befehlszeile akzeptiert, können Sie sys.argv[2] folgendermaßen übergeben:

def myfunction(mystring):
    print mystring


if __== '__main__':
    globals()[sys.argv[1]](sys.argv[2])

Auf diese Weise wird beim Ausführen von python myscript.py myfunction "hello"hello ausgegeben.

13
Noam Hacker

Machen wir es uns etwas leichter und verwenden nur ein Modul ...

Versuchen Sie: pip install compago

Dann schreibe:

import compago
app = compago.Application()

@app.command
def hello():
    print "hi there!"

@app.command
def goodbye():
    print "see ya later."

if __== "__main__":
    app.run()

Dann benutze wie folgt:

$ python test.py hello
hi there!

$ python test.py goodbye
see ya later.

Hinweis: In Python 3 befindet sich derzeit ein Fehler , das mit Python 2 hervorragend funktioniert.

Edit: Eine noch bessere Option ist meiner Meinung nach das Modul fire von Google, mit dem es einfach ist, auch Funktionsargumente zu übergeben . Es wird mit pip install fire installiert. 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 __== '__main__':
  fire.Fire(Calculator)

Anschließend können Sie über die Befehlszeile Folgendes ausführen:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30
5
Charles Clayton

Interessanterweise können Sie Eingaben in den python -Interpreter wie folgt umleiten, wenn das Ziel darin bestand, über die Befehlszeilenkonsole zu drucken oder eine andere winzige python -Operation auszuführen:

echo print("hi:)") | python

sowie Pipe-Dateien ..

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 möglicherweise die Zeichen entkommen müssen

echo print\(\"hi:\)\"\) | python
5
Torie J

Wenn Sie das runp-Paket mit pip install runp installieren, müssen Sie Folgendes ausführen:

runp myfile.py hello

Sie finden das Repository unter: https://github.com/vascop/runp

5
vascop

Ich musste verschiedene python Dienstprogramme (range, string, etc.) in der Befehlszeile verwenden und hatte das Tool pyfunc speziell dafür geschrieben. Sie können es verwenden, um die Benutzererfahrung in der Befehlszeile zu verbessern:

 $ 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
4
Saurabh Hirani

Etwa so: 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

Dies funktioniert in Bash.

$ ip='"hi"' ; fun_name='call_from_terminal' 
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi
1
Al Conrad

Es ist immer eine Option, python in der Befehlszeile mit dem Befehl python einzugeben

dann importiere deine Datei so import example_file

führen Sie dann den Befehl mit example_file.hello () aus

Dies vermeidet die seltsame .pyc-Kopierfunktion, die jedes Mal auftritt, wenn Sie python -c usw. ausführen.

Vielleicht nicht so praktisch wie ein Einzelbefehl, aber eine gute schnelle Lösung, um eine Datei über die Befehlszeile zu simsen, und ermöglicht es Ihnen, python zum Aufrufen und Ausführen Ihrer Datei zu verwenden.

1
user2495144

Unten finden Sie die Datei Odd_Even_function.py, in der die Funktion definiert ist.

def OE(n):
    for a in range(n):
        if a % 2 == 0:
            print(a)
        else:
            print(a, "ODD")

Um dasselbe von der Eingabeaufforderung aus aufzurufen, haben sich die folgenden Optionen für mich bewährt.

Options 1 Vollständiger Pfad der exe\python.exe -c "Odd_Even_function importieren; Odd_Even_function.OE (100)"

Option 2 Vollständiger Pfad der exe\python.exe -c "aus Odd_Even_function import OE; OE (100)"

Vielen Dank.

1
moxit mehta

Diese Funktion kann nicht über die Befehlszeile ausgeführt werden, da sie einen Wert zurückgibt, der nicht weitergegeben wird. Sie können die Rücksendung entfernen und stattdessen print verwenden

0
Shubham