2009-10-27 13 views
9

¿Pueden todas las rutas en un programa de Python usar "..." (para el directorio padre) y/(para separar componentes de ruta), y seguir trabajando sea cual sea la plataforma?Trayectorias Unix: ¿Funcionar oficialmente en Python para cualquier plataforma?

Por un lado, nunca he visto tal afirmación en la documentación (puede que me haya perdido), y los módulos os y os.path proporcionan facilidades para manejar rutas de una manera independiente de la plataforma (os.pardir, os.path.join, ...), lo que me permite pensar que están aquí por una razón.

Por otro lado, puede read on StackOverflow que "../path/to/file" funciona en todas las plataformas ...

Por lo tanto, debe os.pardir, os.path.join y amigos siempre ser utilizados, para fines de portabilidad, o son nombres de ruta de acceso de Unix siempre seguros (hasta posibles problemas de codificación de caracteres)? o tal vez "casi siempre" seguro (es decir, trabajando bajo Windows, OS X y Linux)?

+4

nunca he tenido un problema con/en windows. – jldupont

Respuesta

6

"Casi siempre seguro" es correcto. Es probable que todas las plataformas que te importan funcionen bien hoy y no creo que cambien sus convenciones en el corto plazo.

Sin embargo, Python es muy portátil y funciona en mucho más que las plataformas habituales. El motivo del módulo os es ayudar a suavizar las cosas que una plataforma tiene requisitos diferentes.

¿Hay alguna buena razón para que no utilice las funciones os?

os.pardir es autodocumentado mientras que ".." no es, y os.pardir podría ser más fácil de grep para

Aquí hay algunos documentos de Python 1.6 Mac cuando todavía era diferente de todo lo

rutinas del sistema operativo para Mac, DOS, NT o Posix, dependiendo del sistema en el que estamos en.

Exportaciones: - todas las funciones de posix, nt, dos, os2, mac o ce, p. Ej. unlink, stat, etc. - os.path es uno de los módulos posixpath, ntpath, macpath o dospath - os.name es 'posix', 'nt', 'dos', 'os2', 'mac', o 'ce' - os.curdir es una cadena que representa el directorio actual ('.' o ':') - os.pardir es una cadena que representa el directorio principal ('..' o '::') - os.sep es el separador de ruta de acceso (o uno más común) ('/' o ':' o '\') - os.altsep es el separador de ruta de acceso alternativo (Ninguno o '/') - os.pathsep es el separador de componentes utilizado en $ PATH, etc. - os.linesep es el separador de línea en archivos de texto ('' o '' o '') - os.defpath es la ruta de búsqueda predeterminada para ejecutables

Los programas que importan y usan 'os' tienen más posibilidades de ser portátiles entre diferentes plataformas. Por supuesto, entonces solo deben usar funciones definidas por todas las plataformas (por ejemplo, desvincular y opendir ), y dejar toda la manipulación del nombre de ruta en os.path (p., divide y únete).

+0

La razón por la que estaba pensando en pasar por alto os.path y co. es que es más simple y bastante claro escribir "../dir1/dir2/dir3/file" en lugar de usar os.path.join (os.pardir, ['dir1', 'dir2', 'dir3', 'file] '])! – EOL

+0

@EOL No puedo pensar en muchos programas reales que lo necesiten. Tal vez tiene sentido mover un camino como ese en un archivo de configuración. –

+0

@gnibbler Mis programas analizan miles de conjuntos de datos y almacenan resultados en ubicaciones convencionales, donde los nombres de los directorios se calculan a partir del "nombre" de cada conjunto de datos. Pero sí, os.path.join (os.pardir, ...) es casi tan corto como la codificación de ruta directa. – EOL

1

OS/X y Linux son ambos compatibles con Unix, por lo que por definición usan el formato que usted dio al principio de la pregunta. Windows permite "/" además de "\" para que los programas puedan ser intercambiables con Xenix, una variante de Unix que Microsoft estaba probando hace mucho tiempo, y que la compatibilidad se ha trasladado hasta el presente. Por lo tanto, también funciona.

No sé cuántas otras plataformas Python ha sido portada, y no puedo hablar por ellas.

3

Dentro de python, usar / siempre funcionará. Tendrá que ser conscientes de la convención sistema operativo si desea ejecutar un comando en un subnivel

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

Comando # 1 probablemente funcionará como se espera.
El comando n. ° 2 podría no funcionar si myprog es un comando de Windows y espera analizar sus argumentos de línea de comando para obtener un nombre de archivo de Windows.

+1

solo una nota al margen: nunca use 'os.system' para ejecutar programas. toma una cadena (no una lista como la usó), e inútilmente invoca un caparazón. Use el módulo 'subprocess' en su lugar. – nosklo

3

Windows admite / como un separador de ruta. Las únicas incompatibilidades entre nombres de ficheros Unix y nombres de archivos de Windows son:

  • los caracteres permitidos en nombres de archivo
  • los nombres especiales y
  • mayúsculas y minúsculas

Windows is more restrictive in the first two accounts (esto es, tiene más caracteres prohibidos y más nombres especiales), mientras que Unix es típicamente sensible a mayúsculas y minúsculas. Hay algunos answers aquí enumerando exactamente cuáles son estos caracteres y nombres. Veré si puedo encontrarlos.

Ahora, si su entorno de desarrollo viene con una función para crear o manipular rutas, debe usarlo, está ahí por una razón, ¿sabe? Especialmente dado que hay muchas más plataformas que Windows y Unix.

Respondiendo a su primera pregunta, sí ../dir/file funcionará, a menos que alcancen algunas de las incompatibilidades mencionadas anteriormente.

+0

No olvide la diferencia en la distinción entre mayúsculas y minúsculas. –

11

Nunca he tenido ningún problema con el uso de .., aunque podría ser una buena idea convertirlo a una ruta absoluta usando os.path.abspath. En segundo lugar, recomendaría usar os.path.join siempre que sea posible.Hay muchos casos de esquina (además de problemas de portabilidad) al unir caminos, y es bueno no tener que preocuparse por ellos. Por ejemplo:

>>> '/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' 

es posible que encuentre problemas con el uso de .. si estás en algunas plataformas oscuros, pero no puedo nombrar a ninguno (Windows, * nix, y OS X todo el apoyo que la notación).

3

Funciona en Windows, por lo que si define "cualquiera que sea la plataforma" para ser Unix y Windows, está bien.

Por otro lado, Python también se ejecuta en VMS, RISC OS y otras plataformas extrañas que usan convenciones de nombre de archivo completamente diferentes. Sin embargo, es probable que intentar que tu aplicación se ejecute en VMS, a ciegas, sea algo tonto de todos modos: "la portabilidad prematura es la raíz de un mal relativamente menor"

Me gusta usar las funciones os.path de todos modos porque son buenos para expresar intenciones; en lugar de solo una concatenación de cadenas, que podría hacerse para cualquiera de un millón de propósitos, se lee de manera muy explícita como una manipulación de ruta.

0

Como han dicho otros, una barra diagonal externa funcionará en todos los casos, pero es mejor que cree una lista de segmentos de ruta y os.path.join() - ing.

Cuestiones relacionadas