Wie kann ich das Arbeitsverzeichnis für einen Unterprozess angeben?

Lesezeit: 3 Minuten

Benutzeravatar von icn
icn

Gibt es eine Möglichkeit, das Ausführungsverzeichnis des Befehls in Python anzugeben subprocess.Popen()?

Zum Beispiel:

Popen('c:\mytool\tool.exe', workingdir="d:\test\local")

Mein Python-Skript befindet sich in C:\programs\python

Laufen ist möglich C:\mytool\tool.exe im Verzeichnis D:\test\local?

Wie lege ich das Arbeitsverzeichnis für einen Unterprozess fest?

  • Denken Sie daran, dass subprocess.call nur ein dünner Wrapper über subprocess.Popen ist, und dieser Wrapper behandelt auch alle Argumente von Popen, zumindest soweit ich mich erinnere 🙂 In einfachen Fällen bleiben Sie besser bei subprocess.call

    – schabunc

    31. Oktober 2013 um 13:49 Uhr

  • Das sollten Sie jetzt wohl vorziehen subprocess.runobwohl call und die etwas neueren Legacy-Wrapper check_call Und check_output sind noch verfügbar.

    – Dreier

    27. Dezember 2022 um 17:57 Uhr

Benutzeravatar von Mark Rushakoff
Mark Ruschakoff

subprocess.Popen nimmt ein cwd Streit um das aktuelle Arbeitsverzeichnis festzulegen; Sie sollten auch Ihren Backslashes entkommen ('d:\\test\\local') oder verwenden r'd:\test\local' damit die Backslashes von Python nicht als Escape-Sequenzen interpretiert werden. So wie du es geschrieben hast, die \t Teil wird in a übersetzt Tab.

Ihre neue Zeile sollte also so aussehen:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')

Um Ihren Python-Skriptpfad als cwd zu verwenden, import os und definiere cwd damit:

os.path.dirname(os.path.realpath(__file__)) 

  • Welche Auswirkung hätte das Hinzufügen von Shell=True zu den Argumenten, wenn überhaupt, auf das Setzen von cwd?

    – T. Stein

    6. November 2009 um 3:17 Uhr

  • @T. Stone: Für eine eigenständige ausführbare Datei sollte es nichts ändern, es sei denn, die exe hängt vielleicht von einigen Umgebungsvariablen in der Shell ab. Aber mit shell=Falsekönnen Sie keine eingebaute Shell wie verwenden cd: dh versuchen Sie dies unter Linux mit Shell in beide Richtungen: subprocess.Popen("cd /tmp; pwd")

    – Mark Rushakoff

    6. November 2009 um 3:22 Uhr

  • Zumindest in Python 3 müssen Sie auch auf einem Windows-Rechner keine Backslashes verwenden, ich habe es gerade getan subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/") und es funktioniert gut

    – mgrandi

    16. August 2013 um 21:05 Uhr

  • Muss das Arbeitsverzeichnis ein absoluter Pfad sein?

    – DX-Smiley

    29. Mai 2015 um 22:12 Uhr

  • Es funktioniert auch für subprocess.check_output(). Danke !

    – Samuel Dauzon

    4. September 2015 um 7:15 Uhr

Ein anderer Weg ist, dies einfach zu tun

cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)

Diese Lösung funktioniert, wenn Sie sich auf relative Pfade verlassen möchten, z. B. wenn der Standort Ihres Werkzeugs lautet c:\some\directory\tool.exe. cwd Stichwortargument für Popen lässt dich das nicht machen. Einige Skripte/Tools verlassen sich möglicherweise darauf, dass Sie sich beim Aufrufen im angegebenen Verzeichnis befinden. Um diesen Code weniger laut zu machen, d. h. die Logik im Zusammenhang mit dem Ändern von Verzeichnissen von der “Geschäftslogik” zu trennen, können Sie einen Dekorator verwenden.

def invoke_at(path: str):
    def parameterized(func):
        def wrapper(*args, **kwargs):
            cwd = os.getcwd()
            os.chdir(path)

            try:
                ret = func(*args, **kwargs)
            finally:
                os.chdir(cwd)

            return ret

        return wrapper

    return parameterized            

Ein solcher Decorator kann dann folgendermaßen verwendet werden:

@invoke_at(r'c:\some\directory')
def start_the_tool():
    subprocess.Popen('tool.exe')

  • Beachten Sie, dass Sie das relative Pfadproblem umgehen können, indem Sie es zuerst lösen, z. B. mit Path("../../something").resolve(). Das heißt, ich verwende es routinemäßig chdir Wenn ich schnelle Skripte schreibe, schreibe ich sonst vielleicht in Bash.

    – 2e0byo

    12. Januar 2022 um 13:20 Uhr

  • @2e0byo Ich muss zugeben, dass ich als hauptsächlich Windows-Entwickler Python gegenüber Batch bevorzuge 🙂 Bash ist keine Option für mich.

    – Ashrasmun

    12. Januar 2022 um 16:26 Uhr

  • Eigentlich ist das der einzige Weg (oder besser: Workaround), den ich finden kann, um das Arbeitsverzeichnis zu “setzen”, wenn ich Popen verwende. Danke.

    – Anion

    6. August 2022 um 9:45 Uhr

1443340cookie-checkWie kann ich das Arbeitsverzeichnis für einen Unterprozess angeben?

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

Privacy policy