2010-06-11 10 views
11

Me preguntaba cómo hacer que una secuencia de comandos python sea portátil tanto para Linux como para Windows.cómo hacer que una secuencia de comandos python o perl sea portátil tanto para Linux como para Windows?

Un problema que veo es shebang. ¿Cómo escribir el shebang para que el script pueda ejecutarse tanto en Windows como en Linux?

¿Hay otros problemas además de shebang que debería saber?

¿La solución es la misma para el script perl?

¡Gracias y saludos!

Respuesta

14

Windows simplemente ignorará el shebang (que, después de todo, es un comentario); en Windows necesitas asociar la extensión .py al ejecutable de Python en el registro, pero puedes dejar el shebang perfectamente, será perfectamente inocua allí.

Hay muchos bits y piezas que son específicos de la plataforma (muchos solo existen en Unix, msvcrt solo en Windows) por lo que si desea ser portátil, debe abstenerse de aquellos; algunos son sutilmente diferentes (como el comportamiento preciso detallado de subprocess.Popen o mmap); todo es bastante avanzado y los documentos te guiarán hasta allí. Si está ejecutando (a través de subprocess o de otro modo) comandos externos, es mejor que se asegure de que existan en ambas plataformas, por supuesto, o compruebe en qué plataforma se encuentra y utilice diferentes comandos externos en cada caso.

Recuerde utilizar siempre /, no \, como separador de ruta (barra diagonal obras en ambas plataformas, hacia atrás recortar es sólo para Windows), y ser meticuloso en cuanto a si cada archivo que está abriendo es binario o de texto .

creo que eso es todo ...

+1

Mejor aún, use la constante 'os.path.sep' como separador de ruta. – dan04

+0

¡Gracias, Alex! Si shebang se ignora en Windows, entonces ¿por qué hay esta pregunta "¿Cómo ignoro el Perl shebang en Windows con Apache 2?". Consulte http://stackoverflow.com/questions/2036577/how-doi-i-ignore-the-perl-shebang-on-windows-with-apache-2. – Tim

+1

@Tim, mientras que Windows ignora el shebang, los programas que se ejecutan bajo Windows pueden ver esa línea, y lo mismo ocurre con un editor de texto para un servidor web. Apache en Windows hace su propia interpretación de shebang, pero lidiar con eso es un problema de administración del sistema sobre la configuración de Apache, nada que ver con Python o stackoverflow en absoluto (es una pregunta de servidor). –

2

La línea shebang se interpretará como un comentario de Perl o Python. Lo único que le asigna un significado especial es el shell UNIX/Linux; se ignora en Windows. La forma en que Windows sabe qué intérprete usar para ejecutar el archivo es a través de las asociaciones de archivos en el registro, un mecanismo completamente diferente.

+0

Nota bastante cierto. perl buscará banderas en la línea shebang. Intenta ejecutar un archivo que contenga '#! perl -p' – justintime

+0

De hecho, si creas un archivo .pl que comience '#! python' then perl llamará a python. – justintime

+0

ah cierto, me olvidé de eso. (Estoy demasiado acostumbrado a Python, que AFAIK ignora por completo la línea de shebang) –

7

Asegúrese de que no se manejan los archivos y directorios en forma de cadenas y simplemente concatena con una raya vertical en el medio. Perl:

$path = File::Spec->catfile("dir1", "dir2", "file") 

Recuerde que Windows tiene volúmenes:

($volume, $path, $file) = File::Spec->splitpath($full_path); 
@directories = File::Spec->splitdir($path); 

Cuando se ejecutan otros programas, trate de evitar la participación de la cáscara. En Perl, al ejecutar un comando con la función system, se puede obtener fácilmente mal con:

$full_command = 'C:\Documents and Settings/program.exe "arg1" arg2'; # spaces alert! 
system($full_command); 

su lugar, puede ejecutar el sistema con una lista como argumento: el ejecutable y los argumentos son cadenas separadas. En ese caso, el shell no se involucra y no se mete en problemas con respecto al escape del shell o espacios en los nombres de los archivos.

system('C:\Documents and Settings/program.exe', 'arg1', 'arg2'); 

Hay un montón de liendres portabilidad documentados en el manual perlport.

2

No sé lo suficiente como para comentar sobre los enfoques de Python para este problema, por lo que no lo haré.

La mayoría de las cosas en Perl simplemente funcionarán. Hay algunos inconvenientes que son fáciles de evitar.

Estas son algunas cosas que me he encontrado en los años que he estado trabajando con Win32 Perl:

  • Uso 3 forman argumento de open. La forma de dos argumentos puede tener problemas con los espacios en las rutas. (Debería estar haciendo esto de todos modos.)
  • Asegúrese de que la carcasa sea correcta cuando utiliza un módulo. use Warnings; parecerá que funciona, pero en realidad fallará.
  • select solo funciona en sockets reales en Windows. No puede usarlo en ningún otro tipo de mango.
  • Use File::Spec para administrar las rutas a los archivos.
  • Cuando abre un identificador de archivo CRLF se convertirá automáticamente a LF terminaciones de línea a medida que se lee el identificador. LF se cambia a CRLF en escritura. Si desea evitar esto, use binmode en el mango para evitar la traducción.
  • Si necesita pasar argumentos a través de un shell, ponga comillas dobles alrededor de cada argumento. Esto evitará errores debido a espacios en los nombres de archivo.

Consulte perlport para obtener más información sobre las funciones individuales.

Cuestiones relacionadas