Question

Tous les chemins d'un programme Python peuvent-ils utiliser " .. " (pour le répertoire parent) et / (pour séparer les composants de chemin), et fonctionnent toujours quelle que soit la plate-forme ?

D'un côté, je n'ai jamais vu une telle affirmation dans la documentation (je l'ai peut-être manquée), et les modules os et os.path fournissent des facilités pour gérer les chemins de manière agnostique sur la plateforme (os.pardir, os .path.join, & # 8230;), ce qui me laisse penser qu’ils sont ici pour une raison.

D'autre part, vous pouvez lire sur StackOverflow que " ../ path / to / file " fonctionne sur toutes les plateformes & # 8230;

Alors, os.pardir, os.path.join et ses amis doivent-ils toujours être utilisés, à des fins de portabilité, ou les noms de chemins Unix sont-ils toujours sûrs (jusqu’à problèmes de codage de caractères)? ou peut-être " presque toujours " sûr (c'est-à-dire travailler sous Windows, OS X et Linux)?

Était-ce utile?

La solution

" Presque toujours en sécurité " est juste. Toutes les plates-formes qui vous intéressent fonctionnent probablement bien aujourd'hui et je ne pense pas qu'elles vont changer leurs conventions dans un avenir proche.

Cependant, Python est très portable et fonctionne sur beaucoup plus que les plates-formes habituelles. La raison d'être du module os est d'aider à simplifier les choses. Une plate-forme a des exigences différentes.

Existe-t-il une bonne raison pour que vous n'utilisiez pas les fonctions os ?

os.pardir s'auto-documente alors que "..." ne l'est pas et os.pardir pourrait être plus facile à grep pour

Voici quelques documents de python 1.6 alors que Mac était encore différent pour tout

  

Routines OS pour Mac, DOS, NT ou Posix selon le système utilisé   sur.

     

Cela exporte:     - toutes les fonctions de posix, nt, dos, os2, mac ou ce, par ex. unlink, stat, etc.     - os.path est l'un des modules posixpath, ntpath, macpath ou dospath     - os.name est 'posix', 'nt', 'dos', 'os2', 'mac' ou 'ce'     - os.curdir est une chaîne représentant le répertoire actuel ('.' ou ':')     - os.pardir est une chaîne représentant le répertoire parent ('..' ou '::')     - os.sep est le séparateur de chemin d'accès (ou le plus courant) ('/' ou ':' ou '\')     - os.altsep est le séparateur de chemin alternatif (aucun ou '/')     - os.pathsep est le séparateur de composant utilisé dans $ PATH, etc.     - os.linesep est le séparateur de ligne dans les fichiers texte ('' ou '' ou '')     - os.defpath est le chemin de recherche par défaut des exécutables

     

Les programmes qui importent et utilisent 'os' ont de meilleures chances d'être   portable entre différentes plates-formes. Bien sûr, ils doivent alors seulement   utiliser des fonctions définies par toutes les plates-formes (par exemple, dissocier et   opendir) et laissez toutes les manipulations de chemin d'accès à os.path (par exemple,   et rejoindre).

Autres conseils

Je n’ai jamais eu de problèmes avec .. , bien que ce soit une bonne idée de le convertir en chemin absolu en utilisant os.path.abspath . Deuxièmement, je recommanderais de toujours utiliser os.path.join autant que possible. Il existe de nombreux cas délicats (à part des problèmes de portabilité) liés à la jonction de chemins, et il est bon de ne pas avoir à s'en soucier. Par exemple:

>>> '/foo/bar/' + 'qux'
'/foo/bar/qux'
>>> '/foo/bar' + 'qux'
'/foo/barqux'
>>> from os.path import join
>>> join('/foo/bar/', 'qux')
'/foo/bar/qux'
>>> join('/foo/bar', 'qux')
'/foo/bar/qux'

Vous pouvez rencontrer des problèmes d'utilisation de .. si vous utilisez une plate-forme obscure, mais je ne peux en nommer aucune (Windows, * nix et OS X prennent tous en charge cette notation).

Dans python, l’utilisation de / fonctionnera toujours. Vous devez connaître la convention du système d'exploitation si vous souhaitez exécuter une commande dans un sous-shell

myprog = "/path/to/my/program"
os.system([myprog, "-n"])                           # 1
os.system([myprog, "C:/input/file/to/myprog"])      # 2

La commande n ° 1 fonctionnera probablement comme prévu.
La commande n ° 2 risque de ne pas fonctionner si myprog est une commande Windows et s'attend à analyser ses arguments en ligne de commande pour obtenir un nom de fichier Windows.

Cela fonctionne sous Windows, donc si vous définissez "quelle que soit la plate-forme" être Unix et Windows, ça va.

D’autre part, Python s’exécute également sur VMS, le système d’exploitation RISC et sur d’autres plates-formes impaires qui utilisent des conventions de nom de fichier complètement différentes. Cependant, il est probable qu'essayer de faire fonctionner votre application sur VMS, à l'aveugle, est un peu idiot de toute façon - "la portabilité prématurée est à l'origine d'un mal relativement mineur".

J'aime quand même utiliser les fonctions os.path car elles permettent d'exprimer une intention - au lieu d'une simple concaténation de chaînes, qui pourrait être utilisée à des fins d'un million, elle se lit très explicitement comme une manipulation de chemin.

Windows prend en charge / en tant que séparateur de chemin. Les seules incompatibilités entre les noms de fichiers Unix et les noms de fichiers Windows sont les suivantes:

  • les caractères autorisés dans les noms de fichiers
  • les noms spéciaux et
  • sensibilité à la casse

Windows est plus restrictif dans les deux premiers comptes . En d’autres termes, il a plus de caractères interdits et plus de noms spéciaux), alors qu’Unix est généralement sensible à la casse. Il y a des réponses . ici énumérant exactement quels sont ces caractères et noms. Je verrai si je peux les trouver.

Maintenant, si votre environnement de développement inclut une fonction permettant de créer ou de manipuler des chemins, vous devez l’utiliser, c’est pour une raison, vous savez. D'autant plus qu'il y a beaucoup plus de plateformes que Windows et Unix.

En répondant à votre première question, oui ../ répertoire / fichier fonctionnera, sauf si certaines des incompatibilités susmentionnées ont été rencontrées.

OS / X et Linux sont tous deux compatibles Unix. Par conséquent, ils utilisent par définition le format que vous avez indiqué au début de la question. Windows autorise " / " en plus de " \ " afin que les programmes puissent être interchangeables avec Xenix, une variante Unix testée par Microsoft il y a longtemps, et que la compatibilité a été reportée au présent. Ainsi cela fonctionne aussi.

Je ne sais pas combien d'autres plates-formes sur lesquelles Python a été porté, et je ne peux pas parler pour elles.

Comme d'autres l'ont dit, une barre oblique marche dans tous les cas, mais il vaut mieux créer une liste de segments de chemin d'accès et os.path.join () - les.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top