¿Cómo hacer que un script de Python o Perl sea portátil tanto para Linux como para Windows?

Me preguntaba cómo hacer un script de Python portátil para Linux y Windows?

Un problema que veo es Shebang. ¿Cómo escribir el shebang para que el script se pueda ejecutar 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!

Windows simplemente ignorará el shebang (que es, después de todo, un comentario); en Windows necesitas asociar la extensión .py al ejecutable de Python en el registro, pero puedes dejar el shebang encendido perfectamente, será perfectamente inocuo 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 quieres ser portátil debes abstenerte de ellos; algunos son sutilmente diferentes (como el comportamiento preciso y detallado del subprocess.Popen o mmap ): todo es bastante avanzado y los documentos lo guiarán allí. Si está ejecutando (a través de subprocess o de otra manera) comandos externos, debería asegurarse de que existan en ambas plataformas, por supuesto, o verificar en qué plataforma se encuentra y usar diferentes comandos externos en cada caso.

Recuerde usar siempre / , no \ , como separador de ruta (la barra inclinada hacia adelante funciona en ambas plataformas, la barra invertida es solo para ventanas) y ser meticuloso en cuanto a si cada archivo que está abriendo es binario o de texto.

Creo que eso es todo …

Asegúrese de no manejar archivos y directorios como cadenas y simplemente concatene con una barra entre ellos. Perl:

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

Recuerda que Windows tiene volúmenes:

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

Cuando ejecutes otros progtwigs, trata de evitar involucrar al shell. En Perl, cuando ejecuta un comando con la función del system , puede equivocarse fácilmente con:

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

En 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 usted no se mete en problemas con el escape de shell o los espacios en los nombres de los archivos.

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

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

La línea shebang se interpretará como un comentario de Perl o Python. Lo único que le asigna un significado especial es el shell de 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.

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

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

Estas son algunas de las cosas que he encontrado en los años que llevo trabajando con Win32 Perl:

  • Usa 3 argumentos de forma open . La forma de dos argumentos puede tener problemas con espacios en las rutas. (Ya deberías estar haciendo esto de todos modos.)
  • Asegúrese de que el caso sea correcto cuando utilice un módulo. use Warnings; Parecerá que funciona, pero en realidad fallará.
  • select solo funciona en sockets reales en Windows. No puedes usarlo en ningún otro tipo de mango.
  • Use File::Spec para administrar las rutas a los archivos.
  • Al abrir un identificador de archivo, CRLF se convertirá automáticamente en finales de línea LF medida que se lea el identificador. LF se cambia a CRLF en escritura. Si desea evitar esto, use binmode en el identificador 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 archivos.

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