web-dev-qa-db-de.com

Was ist der beste Weg, um ein Skript aus einem anderen Skript aufzurufen?

Ich habe ein Skript namens test1.py, das sich nicht in einem Modul befindet. Es hat nur Code, der ausgeführt werden soll, wenn das Skript selbst ausgeführt wird. Es gibt keine Funktionen, Klassen, Methoden usw. Ich habe ein anderes Skript, das als Dienst ausgeführt wird. Ich möchte test1.py vom Skript aus aufrufen, das als Dienst ausgeführt wird.

Zum Beispiel:

Datei test1.py

print "I am a test"
print "see! I do nothing productive."

Datei service.py

# Lots of stuff here
test1.py # do whatever is in test1.py

Mir ist eine Methode bekannt, mit der die Datei geöffnet, der Inhalt gelesen und im Wesentlichen ausgewertet wird. Ich gehe davon aus, dass es einen besseren Weg gibt, dies zu tun. Oder zumindest hoffe ich es.

235
Josh Smeaton

Der übliche Weg, dies zu tun, ist ungefähr wie folgt.

test1.py

def some_func():
    print 'in test 1, unproductive'

if __== '__main__':
    # test1.py executed as script
    # do something
    some_func()

service.py

import test1

def service_func():
    print 'service func'

if __== '__main__':
    # service.py executed as script
    # do something
    service_func()
    test1.some_func()
228
ars

Dies ist in Python 2 mithilfe von möglich

execfile("test2.py")

Informationen zum Umgang mit Namespaces finden Sie in der documentation , falls dies in Ihrem Fall wichtig ist.

Sie sollten jedoch einen anderen Ansatz in Betracht ziehen. Ihre Idee (von dem, was ich sehen kann) sieht nicht sehr sauber aus.

114
balpha

Ein anderer Weg:

Datei test1.py:

print "test1.py"

Datei service.py:

import subprocess

subprocess.call("test1.py", Shell=True)

Der Vorteil dieser Methode besteht darin, dass Sie kein vorhandenes Python-Skript bearbeiten müssen, um den gesamten Code in eine Subroutine zu kopieren.

Dokumentation: Python 2 , Python 3

58
Dick Goodwin

Wenn Sie möchten, dass test1.py mit der gleichen Funktionalität ausgeführt wird, wie beim Aufruf in service.py, führen Sie folgende Schritte aus:

test1.py

def main():
    print "I am a test"
    print "see! I do nothing productive."

if __== "__main__":
    main()

service.py

import test1
# lots of stuff here
test1.main() # do whatever is in test1.py
17

Sie sollten das nicht tun. Stattdessen:

test1.py:

 def print_test():
      print "I am a test"
      print "see! I do nothing productive."

service.py

#near the top
from test1 import print_test
#lots of stuff here
print_test()
11
thedz

Verwenden Sie import test1 für die erste Verwendung - das Skript wird ausgeführt. Behandeln Sie das Skript für spätere Aufrufe als importiertes Modul und rufen Sie die reload(test1) -Methode auf.

Wenn reload(module) ausgeführt wird:

  • Der Code von Python-Modulen wird neu kompiliert und der Code auf Modulebene erneut ausgeführt, wodurch eine neue Menge von Objekten definiert wird, die an Namen im Wörterbuchverzeichnis des Moduls gebunden sind. Die Init-Funktion von Erweiterungsmodulen wird nicht aufgerufen 

Eine einfache Überprüfung von sys.modules kann zum Aufrufen der entsprechenden Aktion verwendet werden. Verwenden Sie 'import ()' builtin, um den Skriptnamen weiterhin als Zeichenfolge ('test1') zu referenzieren.

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')
7
gimel
import os

os.system("python myOtherScript.py arg1 arg2 arg3")  

Mit os können Sie direkt zu Ihrem Endgerät telefonieren. Wenn Sie noch genauer sein möchten, können Sie Ihre Eingabezeichenfolge mit lokalen Variablen verketten, z.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
5
Alex Mapley

Warum nicht einfach test1 importieren? Jedes Python-Skript ist ein Modul. Ein besserer Weg wäre, eine Funktion zu haben, z. main/run in test1.py, importiere test1 und starte test1.main (). Oder Sie können test1.py als Unterprozess ausführen.

1
Anurag Uniyal

Dies ist ein Beispiel mit der subprocess-Bibliothek:

import subprocess

python_version = '3'
path_to_run = './'
py_name = '__main__.py'

# args = [f"python{python_version}", f"{path_to_run}{py_name}"]  # Avaible in python3
args = ["python{}".format(python_version), "{}{}".format(path_to_run, py_name)]

res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)
1
Benyamin Jafari

Ich fand dieses einfache Beispiel unter http://hplgit.github.io/primer.html/doc/pub/tech/._tech-solarized012.html , um ein python -Skript aufzurufen aus einem anderen heraus, auch wenn Sie mehrere Argumente angeben müssen

import subprocess
cmd = 'python train_frcnn.py --input_weight_path model_frcnn.hdf5 -o simple -p take2.csv'
subprocess.call(cmd, Shell=True)
0
Shreya