2009-07-13 17 views
1

J'ai beaucoup de répertoires avec des fichiers texte écrits en utilisant (g) vim, et j'ai écrit une poignée d'utilitaires que je trouve utiles en Python. Je démarre les utilitaires avec une ligne python pound-bang/usr/bin/env afin d'utiliser le Python installé sous cygwin. Je voudrais taper des commandes comme celle-ci:Comment puis-je dire à un script Python (cygwin) de fonctionner dans les répertoires actuels (ou relatifs)?

% cd ~/SomeBook

%, ce qui pythonUtil

/usr/local/bin/pythonUtil

% pythonUtil ./infile.txt ./ outfile.txt

(ou% pythonUtil someRelPath/infile.txt somePossiblyDifferentRelPath/outfile.txt)

pythonUtil: Trouvé infile.txt; Ecrire outfile.txt; Fait (ou un tel, si quelque chose)

Cependant, mes programmes pythonUtil continuent à me dire qu'ils ne peuvent pas trouver infile.txt. Si je copie l'utilitaire dans le répertoire de travail actuel, tout va bien, mais j'ai alors des copies de mes utilitaires qui jonchent le paysage. Que devrais-je faire?

Encore une autre édition: Pour résumer --- ce que je voulais était os.path.abspath ('filename'). Cela renvoie le chemin d'accès absolu sous forme de chaîne, puis toute ambiguïté a été supprimée. MAIS: Si le Python utilisé est celui installé sous cygwin, ALORS le chemin absolu sera un chemin relatif à CYGWIN, comme /home/someUser/someDir/someFile.txt. Cependant, si le Python a été installé sous Windows (et est appelé depuis une ligne de commande du terminal cygwin), alors le chemin absolu sera le chemin Windows complet, de 'drive' vers le bas, comme D: \ cygwin \ home \ someUser \ someDir \ someFile.txt. Moralité: Ne vous attendez pas à ce que le Python cygwin génère un chemin d'accès absolu Windows pour un fichier non rooté à /; c'est au-delà de son horizon d'événements. Cependant, vous pouvez accéder à n'importe quel fichier sur un système WinXP avec cygwin-python si vous spécifiez le chemin du fichier en utilisant la convention de leadin "/ cygdrive/driveLetter". Remarque: N'utilisez pas les '\' pour les séparateurs dans le chemin WinXP sur la ligne de commande cygwin; utilisez '/' et faites confiance au serpent. Aucune idée pourquoi, mais certains séparateurs peuvent être supprimés et le chemin peut être modifié pour inclure des niveaux supplémentaires, tels que "Documents and Settings \ someUser" et d'autres non-sens Windows.

Merci aux répondeurs de m'avoir poussé dans la bonne direction.

Répondre

4

Regardez os.getcwd:

Edit: Pour les chemins relatifs, s'il vous plaît jeter un oeil sur le module os.path:

en particulier, os. path.join et os.path.normpath. Par exemple:

import os 
print os.path.normpath(os.path.join(os.getcwd(), '../AnotherBook/Chap2.txt')) 
+0

grands esprits ... Ai-je raison de supposer qu'il ya quelque chose là-dedans qui gère les chemins relatifs, aussi? Je suppose que je vais aller voir. – behindthefall

+0

:) Juste mis à jour la réponse pour les chemins relatifs. – ars

+0

Merci! os.path.abspath ('chemin') me plaît. En quelque sorte enlève toute cette incertitude, et je n'ai pas eu à taper une chose. – behindthefall

0

Qu'est-ce qui se passe quand vous tapez "ls"?Voyez-vous "infile.txt" répertorié?

+0

Oui. Les fichiers texte se trouvent en fait dans le répertoire ~/SomeBook, par exemple. (Je serais très contrarié s'ils ne l'étaient pas!) – behindthefall

0
os.chdir(my_dir) 

ou

os.chdir(os.getcwd()) 
+0

Est-ce que cela répond à la situation relative du chemin? – behindthefall