4 Stimmen

Wechseln des Arbeitsverzeichnisses der Eingabeaufforderung über ein Python-Skript

Ist es möglich, das Arbeitsverzeichnis der Windows-Eingabeaufforderung über ein Python-Skript zu ändern?

z.B..

>> cd
>> c:\windows\system32
>> make_decision_change_dir.py
>> cd
>> c:\windows

Ich habe ein paar Dinge ausprobiert, die nicht funktionieren:

import os
os.chdir(path)

import os, subprocess
subprocess.Popen("chdir /D \"%s\"" %path, shell=True)

import os, subprocess
subprocess.Popen("cd \"%s\"" %path, shell=True)

import os, subprocess
subprocess.Popen("CD=\"%s\"" %path, shell=True)

So wie ich es verstehe und beobachte, ändern diese Operationen das Arbeitsverzeichnis des aktuellen Prozesses - das ist der Python-Prozess und nicht die Eingabeaufforderung, von der aus er ausgeführt wird.

Danke.

UPDATE

Der Pfad, zu dem ich wechseln möchte, ist dynamisch (je nachdem, an welchem Projekt ich arbeite, ändert sich der vollständige Pfad zu einem Build-Speicherort), daher wollte ich eine Lösung in Python codieren, anstatt mit einer Windows-Batch-Datei herumzuhacken.

UPDATE

Am Ende musste ich eine Batch-Datei zusammenhacken, um dies zu tun ;( Vielen Dank an alle.

0 Stimmen

Was ist falsch an einer 1-zeiligen BAT-Datei? Warum Python schreiben?

0 Stimmen

Der Pfad ist nicht statisch, denn je nach Programm, an dem ich arbeite, ändert sich ein Teil des Pfades. Deshalb zerlege ich das Verzeichnis, suche nach dem richtigen Pfad und wechsle dann dorthin. Eine schlechte Dateistruktur, aber ich habe sie nicht geschaffen, ich muss nur damit arbeiten!

0 Stimmen

Bitte aktualisieren Sie Ihre Frage mit diesen zusätzlichen Fakten.

3voto

Dave Webb Punkte 184809

Mir ist nicht klar, was Sie hier tun wollen. Wollen Sie ein Python-Skript, das Sie von einer Windows-Eingabeaufforderung aus ausführen können und das das Arbeitsverzeichnis der Windows-Befehlssitzung ändert?

Wenn ja, bin ich mir zu 99,9 % sicher, dass das unmöglich ist. Wie Sie selbst sagten, ist die python.exe Prozess ist ein vom Windows-Prozess getrennter Prozess cmd.exe und alles, was Sie in Python tun, hat keinen Einfluss auf die Eingabeaufforderung.

Vielleicht kann man etwas über die Windows-API machen, indem man Tastatureingaben an Windows oder so sendet, aber das wäre ziemlich spröde.

Die einzigen beiden praktischen Optionen, die mir einfallen, bestehen darin, Ihr Python-Skript in eine Batch-Datei zu verpacken:

  1. Geben Sie Ihr gewünschtes Verzeichnis aus dem Python-Skript aus, lesen Sie die Ausgabe in Ihre Batch-Datei ein und kopieren Sie sie auf CD.
  2. Starten Sie Ihr Python-Skript aus einer Batch-Datei, erlauben Sie Ihrem Python-Skript, eine neue cmd.exe Fenster und rufen Sie die Batch-Datei auf, um das ursprüngliche Befehlsfenster zu schließen.

0 Stimmen

Danke für die Bestätigung der schlechten Nachricht! Ich habe @Ned Batchelder als meine Antwort markiert, da das für mich die nächstbeste Lösung ist. Ich habe allerdings Ihre Antwort verbessert ;-)

2voto

Ned Batchelder Punkte 342778

Ich habe ein Python-Skript, um das Bewegen in einem Dateibaum zu erleichtern: xdir.py

Kurz gesagt, ich habe eine xdir.py-Datei, die Windows-Befehle auf stdout schreibt:

# Obviously, this should be more interesting..
import sys
print "cd", sys.argv[1]

Dann eine Datei xdir.cmd:

@echo off
python xdir.py %* >%TEMP%\__xdir.cmd
call %TEMP%\__xdir.cmd

Dann erstelle ich einen Doskey-Alias:

doskey x=xdir.cmd $*

Das Endergebnis ist, dass ich Folgendes tippen kann

$ x subdir

und wechseln Sie in ein Unterverzeichnis.

Das Skript, das ich oben verlinkt habe, kann noch viel mehr, z. B. die Historie speichern, einen Stapel von Verzeichnissen verwalten, Abkürzungen für Verzeichnisse akzeptieren und so weiter.

0 Stimmen

Ned, ich werde Ihr "xdir"-Skript ausprobieren, das für mich und andere in meinem Team sehr nützlich sein könnte. Danke!

1voto

S.Lott Punkte 371691

Eine gängige Lösung ist ein zweiteiliges Skript.

Teil 1 ist Python, das eine temporäre .BAT-Datei erstellt, die den entsprechenden CD-Befehl enthält.

Teil 2 ist die temporäre .BAT-Datei.

fancycd.bat

python figurethepath.py >temp.bat
temp.bat

1voto

cdleary Punkte 66512

Wie bereits erwähnt, können untergeordnete Prozesse (d.h. Ihr Programm) das aktuelle Arbeitsverzeichnis eines übergeordneten Prozesses (d.h. des Terminals) nicht ändern. Deshalb brauchen Sie die beiden Schritte, die hier beschrieben werden. In den meisten Shells gibt es eine Möglichkeit, ein Makro oder eine Funktion zu erstellen, um diese zweistufige Funktionalität auszuführen.

Zum Beispiel, in bash können Sie einen einzigen Alias erstellen, um den Pfad zu berechnen und das aktuelle Arbeitsverzeichnis zu ändern, ähnlich wie bei @S.Lott beschreibt für Windows:

alias my_cd='TMP=`compute_path.py`; cd $TMP;'

Beachten Sie, dass die cd Befehl wird immer noch im übergeordneten Prozess (dem Terminal) interpretiert, der die Möglichkeit hat, sein eigenes aktuelles Arbeitsverzeichnis zu ändern.

0voto

gimel Punkte 78080

El subprocess.Popen() Dokumentseite sagt, dass ein Kindprozess für den Unterprozess erstellt wird, so dass alle Änderungen des Arbeitsverzeichnisses lokal für diesen Unterprozess sind.

Wenn cwd nicht None ist, wird die Kindes Das aktuelle Verzeichnis wird in cwd geändert, bevor es ausgeführt wird. Beachten Sie, dass dieses Verzeichnis bei der Suche nach der ausführbaren Datei nicht berücksichtigt wird, Sie können also den Pfad des Programms nicht relativ zu cwd angeben.

Dies gilt auch für alle Änderungen, die explizit innerhalb des Unterprozesses vorgenommen werden, ähnlich wie bei den Befehlen, die in der Frage erscheinen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X