Ich möchte ein Skript in einem Unterverzeichnis / Superverzeichnis ausführen (ich muss mich zuerst in diesem Unterverzeichnis / Superverzeichnis befinden). Ich kann subprocess
mein Unterverzeichnis nicht betreten:
tducin@localhost:~/Projekty/tests/ve$ python
Python 2.7.4 (default, Sep 26 2013, 03:20:26)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import os
>>> os.getcwd()
'/home/tducin/Projekty/tests/ve'
>>> subprocess.call(['cd ..'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Python wirft OSError und ich weiß nicht warum. Es spielt keine Rolle, ob ich versuche, in ein vorhandenes Unterverzeichnis oder ein Verzeichnis nach oben zu wechseln (wie oben) - ich habe immer den gleichen Fehler.
python
subprocess
Ducin
quelle
quelle
os.chdir()
stattdessen verwendet wird ?Antworten:
Ihr Code versucht, ein Programm mit dem Namen aufzurufen
cd ..
. Sie möchten einen Befehl mit dem Namen aufrufencd
.Ist
cd
aber eine Shell intern. Sie können es also nur als nennenAber es ist sinnlos, dies zu tun. Da kein Prozess das Arbeitsverzeichnis eines anderen Prozesses ändern kann (zumindest unter einem UNIX-ähnlichen Betriebssystem, aber auch unter Windows), ändert die Subshell bei diesem Aufruf ihr Verzeichnis und wird sofort beendet.
Was Sie wollen, können Sie mit
os.chdir()
oder mit demsubprocess
genannten Parameter erreichen,cwd
der das Arbeitsverzeichnis unmittelbar vor der Ausführung eines Unterprozesses ändert.Sie können dies beispielsweise
ls
im Stammverzeichnis ausführenoder einfach
quelle
cd
existiert normalerweise auch als Binärdatei, nicht nur als eingebaute Shell. Das eigentliche Problem des OP war, dass er eine Binärdatei aufriefcd ..
, ja. (Und Ihr dritter Absatz wäre sein nächstes Problem gewesen, also gute Antwort.)cd
es möglich sein, als Binärdatei zu arbeiten? Es kann das Arbeitsverzeichnis seiner Eltern nicht chanten./usr/bin/cd
besteht ausbuiltin cd "$@"
- also nennt es auch nur die eingebaute Shellcd
.cd
muss als interner Shell-Befehl implementiert werden. Es gibt keinen anderen Weg, es zu tun. Interne Shell-Befehle werden im selben Prozess wie die Shell ausgeführt. Was ich mit Subshell gemeint habe, ist die Shell, für die ausgeführt wurdeshell=True
. Es erhält den auszuführenden Befehl, führt ihn aus und beendet ihn.Um
your_command
als Unterprozess in einem anderen Verzeichnis ausgeführt zu werden, übergeben Sie dencwd
Parameter, wie in der Antwort von @ wim vorgeschlagen :Ein untergeordneter Prozess kann das Arbeitsverzeichnis seines übergeordneten Elements ( normalerweise ) nicht ändern . Das Ausführen
cd ..
in einem untergeordneten Shell-Prozess unter Verwendung eines Unterprozesses ändert das Arbeitsverzeichnis Ihres übergeordneten Python-Skripts nicht, dh das Codebeispiel in der Antwort von @ glglgl ist falsch .cd
Ist eine Shell eingebaut (keine separate ausführbare Datei), kann sie das Verzeichnis nur im selben Prozess ändern .quelle
Sie möchten einen absoluten Pfad zur ausführbaren Datei verwenden und das
cwd
Arbeitsverzeichnis mit kwarg vonPopen
festlegen. Siehe die Dokumente .quelle
subprocess.call(['ls', '-l'], cwd='/')
. Dadurch ändert sich die cwd auf/
und läuft dannls
mit-l
als Argument. Aber wenn ich tun möchte ,os.chdir('/')
und dannopen('etc/fstab', 'r')
kann ich nicht ersetzenos.chdir()
mit etwas über ,subprocess.XXX(cwd='/')
da es nicht helfen, sagte wie. Dies sind zwei völlig unterschiedliche Szenarien.cwd=
bestimmungsgemäß verwende. Das kann ich auchsubprocess.call(['bin/ls', '-l'], cwd='/')
.subprocess.call
und andere Methoden imsubprocess
Modul haben einencwd
Parameter.Dieser Parameter bestimmt das Arbeitsverzeichnis, in dem Sie Ihren Prozess ausführen möchten.
Sie können also so etwas tun:
Überprüfen Sie den docs subprocess.popen-Konstruktor
quelle
Eine weitere Option, die auf dieser Antwort basiert: https://stackoverflow.com/a/29269316/451710
Auf diese Weise können Sie mehrere Befehle (z. B.
cd
) im selben Prozess ausführen .quelle
shell=True, executable='/bin/bash'
Ich denke in diesen Tagen würden Sie tun:
quelle
Wenn Sie über CD-Funktionalität verfügen möchten (vorausgesetzt, Shell = True) und dennoch das Verzeichnis in Bezug auf das Python-Skript ändern möchten, können mit diesem Code 'cd'-Befehle ausgeführt werden.
quelle
Wenn Sie das Verzeichnis wechseln müssen, führen Sie einen Befehl aus und rufen Sie auch die Standardausgabe ab:
quelle