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 EM>? P>
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. P>
7 Réponses :
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. P>
Je ne sais pas combien d'autres plateformes python ont été portées et je ne peux pas en parler pour eux. P>
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
Juste une note latérale - N'utilisez jamais OS.System code> 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 code> à la place.
Windows prend en charge 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. P>
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. P>
Répondre à votre première question, oui / code> comme séparateur de chemin. Les seules incompatibilités entre les noms de fichiers UNIX et les noms de fichiers Windows sont: p>
../ dir / fichier code> fonctionnera, à moins qu'ils ne frappent certaines des incompatibilités mentionnées ci-dessus. P>
N'oubliez pas la différence en cas de sensibilité.
Je n'ai jamais eu de problèmes avec l'utilisation de Vous pouvez rencontrer des problèmes avec l'utilisation de .. code>, 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:
.. code> si vous êtes sur des plates-formes obscures, mais je ne peux pas nommer aucune (Windows, * Nix et OS X supportent tous cette notation). P> P>
Cela fonctionne sous Windows, donc si vous définissez "quelle que soit la plate-forme" d'être UNIX et Windows, vous allez bien. P>
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" p>
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. P >
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. p>
"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. P>
Cependant, Python est très portable et fonctionne beaucoup plus que les plates-formes habituelles. La raison du module code> OS code> est d'aider à lisser les choses sur une plate-forme de différentes exigences. P>
Y a-t-il une bonne raison pour que vous n'utilisez pas les fonctions Voici quelques documents de Python 1.6 lorsque Mac était toujours différent pour tout p>
routines OS pour Mac, DOS, NT ou POSIX en fonction de quel système nous sommes
sur. p>
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 p>
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). P>
blockQuote> os code>? p>
os.pardir code> est auto-documentant alors que
"" " code> n'est pas et os.pardir pourrait être plus facile à grep pour p>
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 code>,
os.join () code>, etc. Fonctions m'a fait me demander si
/ code> 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).
jamais eu de problème avec / sous Windows.