Wie rufe ich ein Skript aus einem anderen Skript auf?

Lesezeit: 5 Minuten

Benutzer-Avatar von Josh Smeaton
Josh Smeaton

Ich habe ein Skript namens test1.py was nicht in einem Modul ist. Es enthält lediglich 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 anrufen test1.py aus dem Skript, 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

  • Der bessere Weg besteht darin, Methoden und Klassen zu schreiben und sie zu verwenden

    – Aamir

    27. Juli 2009 um 7:00 Uhr

  • Verwandt: Python 3: Python-Skript mit Eingabe in einem Python-Skript mithilfe eines Unterprozesses aufrufen

    – jfs

    29. November 2015 um 8:40 Uhr

  • Siehe diese Antwort: stackoverflow.com/a/71967141/1364242

    – Jay M

    22. April 2022 um 10:20 Uhr

Der übliche Weg, dies zu tun, sieht etwa wie folgt aus.

test1.py

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

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

service.py

import test1

def service_func():
    print 'service func'

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

  • Was ist, wenn test1.py liegt in einem weit entfernten Verzeichnis?

    – Jewgeni Sergejew

    8. Juni 2014 um 5:46

  • @EvgeniSergeev Siehe stackoverflow.com/questions/67631/…

    – Jewgeni Sergejew

    8. Juni 2014 um 6:27

  • Das beantwortet die Frage aber nicht wirklich, oder? Sie führen nicht das gesamte Skript aus, sondern einige Funktionen innerhalb des Skripts, das Sie importieren.

    – Gented

    22. März 2017 um 10:36 Uhr

  • @GennaroTedesco: Du liegst falsch. Der import test1 In service.py führt das tatsächlich aus ganz Skript (das nur definiert some_func() seit __name__ == '__main__' wird sein False In diesem Fall). Das hört sich nach allem an, was das OP tun möchte. Diese Antwort geht darüber hinaus, beantwortet aber definitiv die Frage – und noch mehr.

    – Martineau

    6. November 2017 um 17:15 Uhr


  • Wenn, sagen wir, test1.py enthielt nicht die Definition der Funktion some_func() (sondern zum Beispiel nur ein paar Zeilen Code print("hello")), dann würde Ihr Code nicht funktionieren. In diesem speziellen Beispiel funktioniert es, weil Sie im Wesentlichen eine externe Funktion importieren, die Sie anschließend zurückrufen.

    – Gented

    6. November 2017 um 20:29

Benutzeravatar von balpha
balpha

Dies ist in Python 2 mit möglich execfile:

execfile("test2.py")

In Python 3 ist dies mit möglich exec:

exec(open("test2.py").read())

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

Sie sollten jedoch einen anderen Ansatz in Betracht ziehen; Ihre Idee sieht (soweit ich sehen kann) nicht sehr sauber aus.

  • Dieser Ansatz führt die Skripte innerhalb des aufrufenden Namespace aus. 🙂 🙂

    – dmvianna

    21. Okt. 2013 um 5:46


  • Um Befehlszeilenargumente an das Skript zu übergeben, können Sie diese bearbeiten sys.argv Liste.

    – jfs

    13. Januar 2015 um 18:09

  • Umfassendere Behandlung von Python 3-Äquivalenten: stackoverflow.com/questions/436198/…

    – John Y

    4. August 2016 um 15:38

  • Dies akzeptiert keine Argumente (die an die PY-Datei übergeben werden sollen)!

    – Apostolos

    13. September 2018 um 10:43 Uhr

  • Ich möchte, dass es das kompiliert .py in ein .pyc Daher sind nachfolgende Ausführungen schneller. Ich gehe davon aus, dass das dafür nicht funktionieren wird? Grundsätzlich möchte ich das gesamte Skript wie ein Modul importieren und dann das Hauptskript darin ausführen.

    – WinEunuuchs2Unix

    28. April 2021 um 23:00 Uhr

Dick Goodwins Benutzeravatar
Dick Goodwin

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 seinen gesamten Code in eine Unterroutine einzufügen.

Dokumentation: Python 2, Python 3

  • Ich musste es benutzen subprocess.call("./test1.py", shell=True) damit es funktioniert

    – asmaier

    17. April 2013 um 9:45 Uhr

  • Verwende nicht shell=True es sei denn, es ist notwendig.

    – Pjotr ​​Dobrogost

    3. November 2013 um 10:58

  • @PiotrDobrogost – Können Sie angeben, in welchen Situationen dies erforderlich sein würde?

    – sancho.s ReinstateMonicaCellio

    26. Dezember 2013 um 13:12 Uhr

  • Unter einem typischen Unix funktioniert es nicht, wenn sich das aktuelle Verzeichnis nicht in PATH befindet. test1.py sollte ausführbar sein und die Shebang-Zeile (#!/usr/bin/env python) 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')]) Wo get_script_dir() wird hier definiert.

    – jfs

    13. Januar 2015 um 18:14


  • Oder subprocess.call(['python', 'test1.py']).

    – Big McLargeHuge

    6. März 2018 um 16:06 Uhr

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, d. h.

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

Wenn Sie möchten, dass test1.py mit der gleichen Funktionalität ausführbar bleibt wie beim Aufruf in service.py, dann gehen Sie wie folgt vor:

test1.py

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

if __name__ == "__main__":
    main()

service.py

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

  • Was ist, wenn Sie Laufzeitparameter haben?

    – Gabriel Fair

    17. Juni 2018 um 20:00 Uhr

  • sys.argv kann hier weiterhin verwendet werden. Und du kannst def main(*args)wie benötigt

    – OneCricketeer

    17. August 2021 um 18:46 Uhr

Flavios Benutzeravatar
Flavio

ich bevorzuge laufig:

#!/usr/bin/env python
# coding: utf-8

import runpy

runpy.run_path(path_name="script-01.py")
runpy.run_path(path_name="script-02.py")
runpy.run_path(path_name="script-03.py")

  • Was ist, wenn Sie Laufzeitparameter haben?

    – Gabriel Fair

    17. Juni 2018 um 20:00 Uhr

  • sys.argv kann hier weiterhin verwendet werden. Und du kannst def main(*args)wie benötigt

    – OneCricketeer

    17. August 2021 um 18:46 Uhr

Benutzeravatar von thedz
thedz

Das sollten Sie nicht tun. Gehen Sie stattdessen wie folgt vor:

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()

  • Wenn Sie test1 importieren, woher weiß es, wo sich die Datei befindet? Muss es im selben Verzeichnis sein? Was ist, wenn nicht?

    – NULL.Alter

    3. April 2018 um 19:50 Uhr

1450290cookie-checkWie rufe ich ein Skript aus einem anderen Skript auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy