Ich habe ein Skript namens test1.py, das sich nicht in einem Modul befindet. Es enthält 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 über das Skript 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, die darin besteht, die Datei zu öffnen, den Inhalt zu lesen und ihn im Grunde zu bewerten. Ich gehe davon aus, dass es einen besseren Weg gibt, dies zu tun. Zumindest hoffe ich es.
runpy.run_module
Noch hat niemand eine Antwort gepostet ?!Antworten:
Der übliche Weg, dies zu tun, ist ungefähr der folgende.
test1.py
service.py
quelle
test1.py
es sich in einem weit entfernten Verzeichnis befindet?import test1
inservice.py
führt tatsächlich das gesamte Skript aus (das in diesem Fall nur definiert,some_func()
da__name__ == '__main__'
diesFalse
der Fall ist). Das klingt nach allem, was das OP tun möchte. Diese Antwort geht darüber hinaus, beantwortet aber definitiv die Frage - und noch einige mehr.test1.py
die Definition der Funktion nicht enthalten wäresome_func()
(z. B. nur einige Codezeilen),print("hello")
würde Ihr Code nicht funktionieren. In diesem Beispiel funktioniert dies, weil Sie im Wesentlichen eine externe Funktion importieren, die Sie anschließend zurückrufen.Dies ist in Python 2 mit möglich
Informationen zum Umgang mit Namespaces finden Sie in der Dokumentation , falls dies in Ihrem Fall wichtig ist.
In Python 3 ist dies möglich (dank @fantastory)
Sie sollten jedoch einen anderen Ansatz in Betracht ziehen. Ihre Idee (soweit ich sehen kann) sieht nicht sehr sauber aus.
quelle
sys.argv
Liste bearbeiten .Ein anderer Weg:
Datei test1.py:
Datei service.py:
Der Vorteil dieser Methode besteht darin, dass Sie kein vorhandenes Python-Skript bearbeiten müssen, um den gesamten Code in eine Unterroutine einzufügen.
Dokumentation: Python 2 , Python 3
quelle
subprocess.call("./test1.py", shell=True)
, um es zumshell=True
sei denn, es ist notwendig.test1.py
sollte ausführbar sein und die shebang-Zeile (#!/usr/bin/env python
) haben, und Sie sollten den vollständigen Pfad angeben, oder Sie müssen die ausführbare Datei selbst bereitstellen:call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
woget_script_dir()
wird hier definiert .subprocess.call(['python', 'test1.py'])
.Wenn Sie möchten, dass test1.py mit derselben Funktionalität ausführbar bleibt wie beim Aufruf von service.py, gehen Sie wie folgt vor:
test1.py
service.py
quelle
Mit os können Sie direkt an Ihr Terminal telefonieren. Wenn Sie noch spezifischer sein möchten, können Sie Ihre Eingabezeichenfolge mit lokalen Variablen verketten, d. H.
quelle
os.system
sollten vermieden werden, Sie können das gleiche mit jeder Klasse vonPopen, Call,
Sie sollten dies nicht tun. Tun Sie stattdessen:
test1.py:
service.py
quelle
Verwendung
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 diereload(test1)
Methode auf.Eine einfache Überprüfung von
sys.modules
kann verwendet werden, um die entsprechende Aktion aufzurufen.'test1'
Verwenden Sie die integrierte Funktion ' import ()', um weiterhin auf den Skriptnamen als Zeichenfolge ( ) zu verweisen.quelle
reload
ist in Python 3 verschwunden.if __name__ == "__main__":
. B. Guard. Es könnte andere subtilere Unterschiede geben. Lassen Sie keinen beliebigen Code auf globaler Ebene. Legen Sie es in einer Funktion und rufen sie nach dem Import als in der vorgeschlagenen akzeptierten Antwort stattIch bevorzuge Runpy :
quelle
Warum nicht einfach test1 importieren? Jedes Python-Skript ist ein Modul. Ein besserer Weg wäre, eine Funktion zu haben, z. B. main / run in test1.py, import1 und import1.main (). Oder Sie können test1.py als Unterprozess ausführen.
quelle
Wie bereits erwähnt,
runpy
ist dies eine gute Möglichkeit, andere Skripte oder Module über das aktuelle Skript auszuführen.Übrigens ist es durchaus üblich, dass ein Tracer oder Debugger dies tut, und unter solchen Umständen funktionieren Methoden wie das direkte Importieren der Datei oder das Ausführen der Datei in einem Unterprozess normalerweise nicht.
Es muss auch beachtet werden
exec
, um den Code auszuführen. Sie müssen die richtigenrun_globals
Angaben machen, um Importfehler oder andere Probleme zu vermeiden. Sieherunpy._run_code
für weitere Einzelheiten.quelle
Dies ist ein Beispiel mit
subprocess
Bibliothek:quelle
Popen
sei denn, die übergeordneten Funktionen können wirklich nicht das tun, was Sie wollen. In diesem Fallcheck_call
oderrun
würde alles tun, was Sie brauchen und mehr, mit wesentlich weniger Installation in Ihrem eigenen Code.Dieser Prozess ist etwas unorthodox, würde aber in allen Python-Versionen funktionieren.
Angenommen, Sie möchten ein Skript mit dem Namen 'empfehle.py' in einer 'if'-Bedingung ausführen und dann Folgendes verwenden:
Die Technik ist anders, funktioniert aber!
quelle