10
votes

Des chemins UNIX qui fonctionnent pour toute plate-forme de Python?

Tous les chemins dans un programme Python utilisent ".." (pour le répertoire parent) et / (pour les composants de chemin de séparation), et toujours fonctionner quelle que soit la plate-forme ?

D'une part, je n'ai jamais vu une telle réclamation dans la documentation (j'ai peut-être manqué), ainsi que les modules OS et OS.Path offrent des installations pour la manutention des chemins de manière agnostique de la plate-forme (OS.PARDIR, OS .Path.join, ...), ce qui me permet de penser qu'ils sont ici pour une raison.

D'autre part, vous pouvez lire sur Stackoverflow Ce "../path/to/file" fonctionne sur toutes les plateformes ...

Alors, si os.pardir, OS.Path.join et vos amis sont toujours utilisés, à des fins de portabilité, ou sont des noms de chemin UNIX toujours sûrs (éventuels problèmes de codage de caractères)? Ou peut-être "presque toujours" sûr (c'est-à-dire travaillant sous Windows, OS X et Linux)?


1 commentaires

jamais eu de problème avec / sous Windows.


7 Réponses :


1
votes

OS / X et Linux sont à la fois compatibles UNIX, donc par définition, ils utilisent le format que vous avez donné au début de la question. Windows permet "/" en plus de "\" afin que les programmes puissent être interchangeables avec Xenix, une variante UNIX que Microsoft essayait il y a longtemps et que la compatibilité a été reportée au présent. Ainsi, ça marche aussi.

Je ne sais pas combien d'autres plateformes python ont été portées et je ne peux pas en parler pour eux.


0 commentaires

3
votes

dans Python, en utilisant / code> fonctionnera toujours. Vous devrez être conscient de la Convention du système d'exploitation si vous souhaitez exécuter une commande dans un sous-groupe

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


1 commentaires

Juste une note latérale - N'utilisez jamais OS.System pour exécuter des programmes. Il faut une chaîne (pas une liste comme vous l'utilisée) et Invoque Invoque une coquille. Utilisez le module SubProcess à la place.



3
votes

Windows prend en charge / comme séparateur de chemin. Les seules incompatibilités entre les noms de fichiers UNIX et les noms de fichiers Windows sont:

  • Les caractères autorisés dans les noms de fichiers
  • Les noms spéciaux et
  • Sensiture de cas

    Windows est plus restrictif dans les deux premiers comptes (ceci Il a plus de caractères interdites et plus de noms spéciaux), tandis que UNIX est typiquement sensible à la casse. Il y a des Réponses Voici la liste exactement quels sont ces caractères et noms. Je vais voir si je peux les trouver.

    Maintenant, si votre environnement de développement est livré avec une fonction pour créer ou manipuler des chemins, vous devez l'utiliser, il est là pour une raison quelconque. Surtout étant donné qu'il y a beaucoup plus de plates-formes que Windows et Unix.

    Répondre à votre première question, oui ../ dir / fichier fonctionnera, à moins qu'ils ne frappent certaines des incompatibilités mentionnées ci-dessus.


1 commentaires

N'oubliez pas la différence en cas de sensibilité.



11
votes

Je n'ai jamais eu de problèmes avec l'utilisation de .. , bien que ce soit une bonne idée de le convertir en un chemin absolu à l'aide de OS.Path.abspath . Deuxièmement, je recommanderais toujours d'utiliser OS.Path.Join que vous êtes possible. Il y a beaucoup de cas d'angle (mis à part des problèmes de portabilité) dans les chemins de participation et il est bon de ne pas avoir à s'inquiéter d'eux. Par exemple: xxx

Vous pouvez rencontrer des problèmes avec l'utilisation de .. si vous êtes sur des plates-formes obscures, mais je ne peux pas nommer aucune (Windows, * Nix et OS X supportent tous cette notation).


0 commentaires

3
votes

Cela fonctionne sous Windows, donc si vous définissez "quelle que soit la plate-forme" d'être UNIX et Windows, vous allez bien.

D'autre part, Python fonctionne également sur VMS, RISC OS et d'autres plates-formes impaires qui utilisent des conventions de nom de fichier complètement différentes. Cependant, il est probable que l'essaie de faire fonctionner votre application sur VMS, aveugle, est une sorte de stupide de toute façon - "La portabilité prématurée est la racine d'un mal relativement mineur"

J'aime utiliser les fonctions OS.Path de toute façon parce qu'elles sont bonnes pour exprimer l'intention - au lieu d'une concaténation à la chaîne, ce qui pourrait être fait pendant un million de fins, il lit très explicitement comme une manipulation de chemin.


0 commentaires

0
votes

Comme d'autres personnes l'ont dit, une barre oblique fonctionnera dans tous les cas, mais vous ferez mieux de créer une liste de segments de chemin et d'os.path.join () - ing.


0 commentaires

6
votes

"presque toujours en sécurité" est juste. Toutes les plates-formes que vous souciez de travailler probablement bien aujourd'hui et je ne pense pas qu'ils changent de conventions à tout moment.

Cependant, Python est très portable et fonctionne beaucoup plus que les plates-formes habituelles. La raison du module OS est d'aider à lisser les choses sur une plate-forme de différentes exigences.

Y a-t-il une bonne raison pour que vous n'utilisez pas les fonctions os ?

os.pardir est auto-documentant alors que "" " n'est pas et os.pardir pourrait être plus facile à grep pour

Voici quelques documents de Python 1.6 lorsque Mac était toujours différent pour tout

routines OS pour Mac, DOS, NT ou POSIX en fonction de quel système nous sommes sur.

cette exportation: - Toutes les fonctions de POSIX, NT, DOS, OS2, MAC ou CE, E.G. Dislink, statistiques, etc. - OS.Path est l'un des modules POSIXPATH, NTPATH, MACPATH ou DOSPHER - 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 pathername (ou le plus courant) ('/' ou ':' ou '\') - OS.ALTSEP est le séparateur de chemin d'accès 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 pour exécutables

Programmes qui importent et utilisent «OS» de meilleures chances d'être portable entre différentes plates-formes. Bien sûr, ils ne doivent alors que Utilisez des fonctions définies par toutes les plateformes (par exemple, Dislink et Opendir), et laissez toutes les manipulations de pathname à OS.Path (par exemple, Split et rejoindre).


6 commentaires

La raison pour laquelle je pensais à contourner OS.Path et CO. est-ce qu'il est plus simple et assez clair pour écrire "../dir1/dir2/dir3/file" au lieu d'utiliser OS.Path.Join (OS.Pardir, ['Dir1', 'Dir2', 'Dir2', 'Dir3', 'File '])!


@Eol je ne peux pas penser à trop de vrais programmes qui en ont besoin. Peut-être qu'il est logique de déplacer un chemin comme celui-ci dans un fichier de configuration.


@gnibbler mes programmes analysent des milliers d'ensembles de données et stockez des résultats dans des emplacements conventionnels, où les noms d'annuaire sont calculés à partir du «nom» de chaque ensemble de données. Mais oui, os.path.join (OS.Pardir, ...) est presque aussi court que le codage de chemin direct.


Est le fait que Python sur Windows accepte "/" dans les chemins documentés quelque part? Je ne peux pas trouver ça ...


@Eol, ce n'est pas python - c'est dans le API Windows "Note Fichier les fonctions d'E / S dans l'API Windows Convertissez "/" en "\" dans le cadre de la conversion du nom en un nom de style NT, sauf lors de l'utilisation du préfixe "\\? \" Comme indiqué dans les sections suivantes ".


Merci! J'aimerais que le Doc de Python ait dit que Python suit cette convention-en principe, il n'a pas trop, même si ce n'est pas la suivi, cela compliquerait les choses sans bonne raison. :) l'accent mis sur le général os.sep , os.join () , etc. Fonctions m'a fait me demander si / a dû travailler sur Les fenêtres. Je vois maintenant que ces installations sont principalement pour des systèmes d'exploitation plus obscur (non-Windows, non-UNIX / Linux / OS X).