Vous pouvez modifier le répertoire de travail avec:
import os
os.chdir(path)
Il existe deux meilleures pratiques à suivre lors de l'utilisation de cette méthode:
Attrapez l'exception (WindowsError, OSError) sur un chemin non valide. Si l'exception est levée, n'effectuez aucune opération récursive, en particulier destructrice. Ils fonctionneront sur l'ancien chemin et non sur le nouveau.
Retournez à votre ancien répertoire lorsque vous avez terminé. Cela peut être fait d'une manière sûre en enveloppant votre appel chdir dans un gestionnaire de contexte, comme Brian M. Hunt l'a fait dans sa réponse .
La modification du répertoire de travail actuel dans un sous-processus ne modifie pas le répertoire de travail actuel dans le processus parent. Cela vaut également pour l'interpréteur Python. Vous ne pouvez pas utiliser os.chdir()pour modifier le CWD du processus appelant.
La réponse basée sur un décorateur léger de cdunn2001 est l'approche idéale pour le Python moderne. La réponse ci-dessus montre pourquoi. N'appelez jamais en os.chdir()dehors d'un gestionnaire de contexte, sauf si vous pensez savoir ce que vous faites. ( Vous ne le faites probablement pas. )
Cecil Curry
6
C'est le moyen le plus simple dans un shell interactif, je pense. Notez que dans Windows, vous devez utiliser des barres obliques, commeos.chdir("C:/path/to/location")
Josiah
La seule chose à savoir est que si vous faites de votre programme python un exécutable et que vous l'exécutez dans cron, il démarrera dans votre répertoire personnel. Il est donc préférable d'utiliser un chemin d'accès complet. Cela fonctionne certainement, mais j'utilise toujours des chemins d'accès complets dans tout script que j'invoquerais à partir de Python car il n'y a aucune garantie que cela s'appliquera en dehors du programme Python lui-même.
SDsolar
310
Voici un exemple de gestionnaire de contexte pour changer le répertoire de travail. C'est plus simple qu'une version ActiveState mentionnée ailleurs, mais cela fait le travail.
Gestionnaire de contexte: cd
import os
class cd:"""Context manager for changing the current working directory"""def __init__(self, newPath):
self.newPath = os.path.expanduser(newPath)def __enter__(self):
self.savedPath = os.getcwd()
os.chdir(self.newPath)def __exit__(self, etype, value, traceback):
os.chdir(self.savedPath)
import subprocess # just to call an arbitrary command e.g. 'ls'# enter the directory like this:with cd("~/Library"):# we are in ~/Library
subprocess.call("ls")# outside the context manager we are back wherever we started.
Si jamais vous avez besoin de savoir de quel répertoire vous avez changé, vous pouvez simplement ajouter return selfà la fin de __enter__. De cette façon, vous pouvez faire with cd('foo') as cm:et accéder au répertoire précédent en tant quecm.savedPath
Sam F
Notez qu'il y a des cas où le retour à l'ancien répertoire (celui stocké dans "savedPath") n'est pas possible. Par exemple, si un processus plus privilégié exécute un processus moins privilégié, le deuxième processus hérite du premier répertoire de travail des processus, même dans les cas où le deuxième processus ne peut pas entrer dans ce répertoire de travail avec ses propres capacités.
Kai Petzke
140
J'utiliserais os.chdircomme ceci:
os.chdir("/path/to/change/to")
Au fait, si vous avez besoin de comprendre votre chemin actuel, utilisez os.getcwd().
Éclat! Si le commentaire introductif de la réponse acceptée était injecté dans cette réponse, ce serait incommensurablement idéal. Pourtant, cette implémentation concise et sûre de Python garantit tous les votes positifs que je dois donner.
Cecil Curry
3
Pourquoi yieldet non return? Est-ce censé être un générateur?
EKons
Veuillez commenter la pertinence du rendement par rapport au rendement!
NicoBerrogorry
1
@NicoBerrogorry, c'est un générateur. Voir les documents sur contextlib.contextmanager . C'est un modèle très utile en Python, qui mérite d'être appris.
cdunn2001
25
Si vous utilisez une version relativement nouvelle de Python, vous pouvez également utiliser un gestionnaire de contexte, tel que celui-ci :
from __future__ import with_statement
from grizzled.os import working_directory
with working_directory(path_to_directory):# code in here occurs within the directory# code here is in the original directory
MISE À JOUR
Si vous préférez rouler le vôtre:
import os
from contextlib import contextmanager
@contextmanagerdef working_directory(directory):
owd = os.getcwd()try:
os.chdir(directory)yield directory
finally:
os.chdir(owd)
Les dépendances sont mauvaises. Le contextlib.contextmanagerdécorateur intégré de Python est bon. Voir cdunn2001 s » réponse basée décorateur , qui serait idéalement la réponse acceptée maintenant.
Cecil Curry
14
Comme déjà souligné par d'autres, toutes les solutions ci-dessus ne changent que le répertoire de travail du processus en cours. Cela est perdu lorsque vous revenez au shell Unix. Si vous êtes désespéré, vous pouvez changer le répertoire shell parent sous Unix avec cet horrible hack:
def quote_against_shell_expansion(s):import pipes
return pipes.quote(s)def put_text_back_into_terminal_input_buffer(text):# use of this means that it only works in an interactive session# (and if the user types while it runs they could insert characters between the characters in 'text'!)import fcntl, termios
for c in text:
fcntl.ioctl(1, termios.TIOCSTI, c)def change_parent_process_directory(dest):# the horror
put_text_back_into_terminal_input_buffer("cd "+quote_against_shell_expansion(dest)+"\n")
Un hack insensé et fragile reçoit des votes positifs. Personne ne devrait jamais faire cela, en particulier avec cette mise en garde "et si l'utilisateur tape pendant qu'il s'exécute ...". Pourtant, cela titille le cou rebelle en moi de voir que changer le CWD parent est en quelque sorte mais pas vraiment faisable. Upvotes! Upvotes pour tous!
import os
abs_path ='C://a/b/c'
rel_path ='./folder'
os.chdir(abs_path)
os.chdir(rel_path)
Vous pouvez utiliser les deux avec os.chdir (abs_path) ou os.chdir (rel_path), il n'est pas nécessaire d'appeler os.getcwd () pour utiliser un chemin relatif.
Si vous utilisez Spyder et que vous aimez GUI, vous pouvez simplement cliquer sur le bouton de dossier dans le coin supérieur droit de votre écran et parcourir les dossiers / répertoires que vous souhaitez en tant que répertoire actuel. Après cela, vous pouvez aller dans l'onglet Explorateur de fichiers de la fenêtre dans Spyder IDE et vous pouvez voir tous les fichiers / dossiers qui s'y trouvent. pour vérifier votre répertoire de travail actuel, accédez à la console de spyder IDE et tapez simplement
pwd
il imprimera le même chemin que vous avez sélectionné auparavant.
La modification du répertoire actuel du processus de script est triviale. Je pense que la question est en fait de savoir comment changer le répertoire actuel de la fenêtre de commande à partir de laquelle un script python est appelé, ce qui est très difficile. Un script Bat dans Windows ou un script Bash dans un shell Bash peut le faire avec une commande cd ordinaire car le shell lui-même est l'interpréteur. Sous Windows et Linux, Python est un programme et aucun programme ne peut modifier directement l'environnement de son parent. Cependant, la combinaison d'un simple script shell avec un script Python effectuant la plupart des tâches difficiles peut atteindre le résultat souhaité. Par exemple, pour créer une commande cd étendue avec un historique de traversée pour une revisite arrière / avant / sélection, j'ai écrit un script Python relativement complexe invoqué par un simple script bat. La liste de parcours est stockée dans un fichier, avec le répertoire cible sur la première ligne. Lorsque le script python revient, le script bat lit la première ligne du fichier et en fait l'argument à cd. Le script complet de chauve-souris (moins les commentaires pour plus de concision) est:
if _%1== _. goto cdDone
if _%1== _? goto help
if/i _%1 NEQ _-H goto doCd
:help
echo d.bat and dSup.py 2016.03.05.Extended chdir.
echo -C = clear traversal list.
echo -B or nothing = backward (to previous dir).
echo -F or-= forward (to next dir).
echo -R = remove current from list andreturn to previous.
echo -S = select from list.
echo -H,-h,?= help.
echo .= make window title current directory.
echo Anythingelse= target directory.
goto done
:doCd
%~dp0dSup.py %1for/F %%d in(%~dp0dSupList )do(
cd %%d
if errorlevel 1(%~dp0dSup.py -R )
goto cdDone
):cdDone
title %CD%:done
Le script python, dSup.py est:
import sys, os, msvcrt
def indexNoCase ( slist, s ):for idx in range( len( slist )):if slist[idx].upper()== s.upper():return idx
raiseValueError# .........main process ...................if len( sys.argv )<2:
cmd =1# No argument defaults to -B, the most common operationelif sys.argv[1][0]=='-':if len(sys.argv[1])==1:
cmd =2# '-' alone defaults to -F, second most common operation.else:
cmd ='CBFRS'.find( sys.argv[1][1:2].upper())else:
cmd =-1
dir = os.path.abspath( sys.argv[1])+'\n'# cmd is -1 = path, 0 = C, 1 = B, 2 = F, 3 = R, 4 = S
fo = open( os.path.dirname( sys.argv[0])+'\\dSupList', mode ='a+t')
fo.seek(0)
dlist = fo.readlines(-1)if len( dlist )==0:
dlist.append( os.getcwd()+'\n')# Prime new directory list with current.if cmd ==1:# B: move backward, i.e. to previous
target = dlist.pop(0)
dlist.append( target )elif cmd ==2:# F: move forward, i.e. to next
target = dlist.pop( len( dlist )-1)
dlist.insert(0, target )elif cmd ==3:# R: remove current from list. This forces cd to previous, a# desireable side-effect
dlist.pop(0)elif cmd ==4:# S: select from list# The current directory (dlist[0]) is included essentially as ESC.for idx in range( len( dlist )):print('('+ str( idx )+')', dlist[ idx ][:-1])whileTrue:
inp = msvcrt.getche()if inp.isdigit():
inp = int( inp )if inp < len( dlist ):print('')# Print the newline we didn't get from getche.breakprint(' is out of range')# Select 0 means the current directory and the list is not changed. Otherwise# the selected directory is moved to the top of the list. This can be done by# either rotating the whole list until the selection is at the head or pop it# and insert it to 0. It isn't obvious which would be better for the user but# since pop-insert is simpler, it is used.if inp >0:
dlist.insert(0, dlist.pop( inp ))elif cmd ==-1:# -1: dir is the requested new directory.# If it is already in the list then remove it before inserting it at the head.# This takes care of both the common case of it having been recently visited# and the less common case of user mistakenly requesting current, in which# case it is already at the head. Deleting and putting it back is a trivial# inefficiency.try:
dlist.pop( indexNoCase( dlist, dir ))exceptValueError:pass
dlist = dlist[:9]# Control list length by removing older dirs (should be# no more than one).
dlist.insert(0, dir )
fo.truncate(0)if cmd !=0:# C: clear the list
fo.writelines( dlist )
fo.close()
exit(0)
Bien que ce soit une bonne réponse, l'OP a sélectionné une réponse qui dit qu'il ne s'agit pas de changer le CWD du processus parent. Cela dissipe toute confusion possible sur la signification de la question.
The Tin Man
À Tin Man-- cette réponse a été sélectionnée avant que je poste ma suggestion. Je pense que les réponses très variées ont peut-être prêté à confusion. cd dans un processus donné (c'est-à-dire un script python) est si simple que je ne sais pas pourquoi quelqu'un le demanderait.
David McCracken
1
En fait, cette réponse a été choisie il y a des années . S'il n'était pas approprié, il aurait été appelé à plusieurs reprises depuis lors.
The Tin Man
Je pense que la confusion demeure. Plus récemment, la question "simuler la commande" cd "de linux en python et persister le changement de répertoire après la sortie du programme [dupliquer]" a été rejetée comme ayant été répondue ici mais, en fait, cette question n'est pas traitée par la réponse sélectionnée. Ma suggestion est pour Windows mais les problèmes sont les mêmes sous Linux.
os.chdir(os.path.join(os.path.abspath(os.path.curdir),u'subfolder'))
- ou?os.getcwd()
Réponses:
Vous pouvez modifier le répertoire de travail avec:
Il existe deux meilleures pratiques à suivre lors de l'utilisation de cette méthode:
La modification du répertoire de travail actuel dans un sous-processus ne modifie pas le répertoire de travail actuel dans le processus parent. Cela vaut également pour l'interpréteur Python. Vous ne pouvez pas utiliser
os.chdir()
pour modifier le CWD du processus appelant.la source
os.chdir()
dehors d'un gestionnaire de contexte, sauf si vous pensez savoir ce que vous faites. ( Vous ne le faites probablement pas. )os.chdir("C:/path/to/location")
Voici un exemple de gestionnaire de contexte pour changer le répertoire de travail. C'est plus simple qu'une version ActiveState mentionnée ailleurs, mais cela fait le travail.
Gestionnaire de contexte:
cd
Ou essayez l' équivalent plus concis (ci-dessous) , en utilisant ContextManager .
Exemple
la source
return self
à la fin de__enter__
. De cette façon, vous pouvez fairewith cd('foo') as cm:
et accéder au répertoire précédent en tant quecm.savedPath
J'utiliserais
os.chdir
comme ceci:Au fait, si vous avez besoin de comprendre votre chemin actuel, utilisez
os.getcwd()
.Plus ici
la source
cd()
est facile à écrire à l'aide d'un générateur et d'un décorateur.Ensuite, le répertoire est rétabli même après qu'une exception est levée:
la source
try/finally
).yield
et nonreturn
? Est-ce censé être un générateur?Si vous utilisez une version relativement nouvelle de Python, vous pouvez également utiliser un gestionnaire de contexte, tel que celui-ci :
MISE À JOUR
Si vous préférez rouler le vôtre:
la source
contextlib.contextmanager
décorateur intégré de Python est bon. Voir cdunn2001 s » réponse basée décorateur , qui serait idéalement la réponse acceptée maintenant.Comme déjà souligné par d'autres, toutes les solutions ci-dessus ne changent que le répertoire de travail du processus en cours. Cela est perdu lorsque vous revenez au shell Unix. Si vous êtes désespéré, vous pouvez changer le répertoire shell parent sous Unix avec cet horrible hack:
la source
os.chdir()
est la bonne façon.la source
os.chdir()
est la version Pythonique decd
.la source
Vous pouvez utiliser les deux avec os.chdir (abs_path) ou os.chdir (rel_path), il n'est pas nécessaire d'appeler os.getcwd () pour utiliser un chemin relatif.
la source
Plus loin dans la direction indiquée par Brian et basée sur sh (1.0.8+)
la source
Si vous souhaitez effectuer quelque chose comme l'option "cd ..", tapez simplement:
os.chdir ("..")
c'est la même chose que dans Windows cmd: cd .. Bien sûr, l' import os est nécessaire (par exemple le taper comme 1ère ligne de votre code)
la source
Si vous utilisez Spyder et que vous aimez GUI, vous pouvez simplement cliquer sur le bouton de dossier dans le coin supérieur droit de votre écran et parcourir les dossiers / répertoires que vous souhaitez en tant que répertoire actuel. Après cela, vous pouvez aller dans l'onglet Explorateur de fichiers de la fenêtre dans Spyder IDE et vous pouvez voir tous les fichiers / dossiers qui s'y trouvent. pour vérifier votre répertoire de travail actuel, accédez à la console de spyder IDE et tapez simplement
il imprimera le même chemin que vous avez sélectionné auparavant.
la source
La modification du répertoire actuel du processus de script est triviale. Je pense que la question est en fait de savoir comment changer le répertoire actuel de la fenêtre de commande à partir de laquelle un script python est appelé, ce qui est très difficile. Un script Bat dans Windows ou un script Bash dans un shell Bash peut le faire avec une commande cd ordinaire car le shell lui-même est l'interpréteur. Sous Windows et Linux, Python est un programme et aucun programme ne peut modifier directement l'environnement de son parent. Cependant, la combinaison d'un simple script shell avec un script Python effectuant la plupart des tâches difficiles peut atteindre le résultat souhaité. Par exemple, pour créer une commande cd étendue avec un historique de traversée pour une revisite arrière / avant / sélection, j'ai écrit un script Python relativement complexe invoqué par un simple script bat. La liste de parcours est stockée dans un fichier, avec le répertoire cible sur la première ligne. Lorsque le script python revient, le script bat lit la première ligne du fichier et en fait l'argument à cd. Le script complet de chauve-souris (moins les commentaires pour plus de concision) est:
Le script python, dSup.py est:
la source