Pregunta

¿Pueden todas las rutas en un programa Python usar " .. " (para el directorio principal) y / (para separar los componentes de la ruta), y aún funcionan sea cual sea la plataforma ?

Por un lado, nunca he visto tal reclamo 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 agnóstica de plataforma (os.pardir, os .path.join, ...), lo que me permite pensar que están aquí por una razón.

Por otro lado, puede leer en StackOverflow que " ../ ruta / al / archivo " funciona en todas las plataformas ...

Entonces, ¿deberían usarse os.pardir, os.path.join y amigos para fines de portabilidad, o los nombres de ruta de Unix siempre son seguros (hasta posibles problemas de codificación de caracteres)? o tal vez "casi siempre" seguro (es decir, trabajar con Windows, OS X y Linux)?

¿Fue útil?

Solución

" Casi siempre seguro " es correcto. Todas las plataformas que le interesan probablemente funcionen bien hoy y no creo que cambien sus convenciones en el corto plazo.

Sin embargo, Python es muy portátil y se ejecuta en muchas más plataformas que las habituales. La razón del módulo os es ayudar a suavizar las cosas sobre él, una plataforma tiene diferentes requisitos.

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

os.pardir se auto documenta, mientras que " .. " no lo es, y os.pardir podría ser más fácil de obtener

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

  

Rutinas del sistema operativo para Mac, DOS, NT o Posix dependiendo de qué sistema estamos   en.

     

Esto exporta:     - todas las funciones de posix, nt, dos, os2, mac o ce, p. desvincular, estadísticas, 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 padre ('..' o '::')     - os.sep es el separador de nombre de ruta (o el más común) ('/' o ':' o '\')     - os.altsep es el separador de nombre de ruta alternativo (Ninguno o '/')     - os.pathsep es el separador de componentes utilizado en $ PATH, etc.     - os.linesep es el separador de línea en los archivos de texto ('' o '' o '')     - os.defpath es la ruta de búsqueda predeterminada para ejecutables

     

Los programas que importan y usan 'os' tienen una mejor oportunidad de ser   Portátil entre diferentes plataformas. Por supuesto, solo deben   usar funciones definidas por todas las plataformas (por ejemplo, desvincular y   opendir), y deje toda la manipulación del nombre de ruta a os.path (por ejemplo, dividir   y únete).

Otros consejos

Nunca he tenido problemas con el uso de .. , aunque podría ser una buena idea convertirlo en una ruta absoluta usando os.path.abspath . En segundo lugar, recomendaría usar siempre os.path.join siempre que sea posible. Hay muchos casos de esquina (aparte de los problemas de portabilidad) en las rutas de unión, 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'

Puede tener problemas al usar .. si se encuentra en algunas plataformas oscuras, pero no puedo nombrar ninguna (Windows, * nix y OS X admiten esa notación).

Dentro de python, usar / siempre funcionará. Deberá conocer la convención del sistema operativo si desea ejecutar un comando en una subshell

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

El comando # 1 probablemente funcionará como se esperaba.
El comando # 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.

Funciona en Windows, por lo que si define "cualquiera que sea la plataforma" para ser Unix y Windows, estás 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 hacer que su aplicación se ejecute en VMS, ciego, sea un poco 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 buenas para expresar la intención; en lugar de solo una concatenación de cadenas, que podría hacerse para cualquiera de los millones de propósitos, se lee muy explícitamente como una manipulación de ruta.

Windows admite / como separador de ruta. Las únicas incompatibilidades entre los nombres de archivo de Unix y los nombres de archivo de Windows son:

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

Windows es más restrictivo en las dos primeras cuentas (esto es decir, tiene más caracteres prohibidos y nombres más especiales), mientras que Unix suele distinguir entre mayúsculas y minúsculas. Hay algunas respuestas 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 usarla, está ahí por una razón, ya sabes. Especialmente dado que hay muchas más plataformas que Windows y Unix.

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

OS / X y Linux son compatibles con Unix, por lo que, por definición, usan el formato que usted proporcionó 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 esa compatibilidad se ha llevado hasta el presente. Por lo tanto, también funciona.

No sé a cuántas otras plataformas se ha portado Python, y no puedo hablar por ellas.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top