2010-06-11 3 views
11

Je me demandais comment rendre un script python portable pour Linux et Windows?comment rendre un script python ou perl portable à la fois linux et windows?

Un problème que je vois est shebang. Comment écrire le shebang pour que le script puisse être exécuté sur Windows et Linux?

Existe-t-il d'autres problèmes que le shebang que je devrais connaître?

La solution est-elle la même pour le script Perl?

Merci pour votre intérêt!

Répondre

14

Windows ignorera simplement le shebang (qui est, après tout, un commentaire); dans Windows vous devez associer l'extension .py à l'exécutable Python dans le registre, mais vous pouvez parfaitement laisser le shebang, il sera parfaitement inoffensif.

Il existe de nombreux éléments spécifiques à la plate-forme (nombre d'entre eux existent sous Unix, msvcrt uniquement sous Windows). Si vous souhaitez être portable, vous devez vous abstenir de ceux-ci; certains sont subtilement différents (comme le comportement précis détaillé de subprocess.Popen ou mmap) - tout est assez avancé et les docs vous y guideront. Si vous exécutez (via subprocess ou autrement) des commandes externes, assurez-vous qu'elles existent sur les deux plates-formes, bien sûr, ou vérifiez quelle plate-forme vous utilisez et utilisez différentes commandes externes dans chaque cas.

Rappelez-vous de toujours utiliser /, pas\, comme séparateur de chemin (barre oblique travaux dans les deux plates-formes, barre oblique arrière est Windows uniquement), et être méticuleux quant à savoir si chaque fichier que vous ouvrez est binaire ou texte .

Je pense que ce sujet ...

+1

Mieux encore, utilisez la constante 'os.path.sep' comme séparateur de chemin. – dan04

+0

Merci, Alex! Si shebang est ignoré dans Windows, alors pourquoi il y a cette question "Comment puis-je ignorer le shebang Perl sur Windows avec Apache 2?". Voir http://stackoverflow.com/questions/2036577/how-do-i-ignore-the-perl-shebang-on-windows-with-apache-2. – Tim

+1

@Tim, alors que Windows lui-même ignore le shebang, les programmes s'exécutant sous Windows peuvent bien sûr voir cette ligne - et tout comme pour un éditeur de texte, il en va de même pour un serveur web. Apache sur Windows fait sa propre interprétation de shebang - mais gérer cela est un problème d'administration système à propos de la configuration d'apache, rien à voir avec Python ou même stackoverflow (c'est une question serverfault). –

2

La ligne shebang sera interprétée comme un commentaire par Perl ou Python. La seule chose qui lui attribue une signification particulière est le shell UNIX/Linux; il est ignoré sur Windows. La façon dont Windows sait quel interpréteur utiliser pour exécuter le fichier passe par les associations de fichiers dans le registre, un mécanisme complètement différent.

+0

Remarque tout à fait vrai. Perl cherchera des drapeaux dans la ligne Shebang. Essayez d'exécuter un fichier contenant '#! perl -p' – justintime

+0

En effet si vous créez un fichier .pl qui démarre '#! python' alors perl appellera python. – justintime

+0

ah vrai, j'ai oublié cela. (Je suis trop habitué à Python, qui AFAIK ignore complètement la ligne shebang) –

7

Assurez-vous que vous ne gérez pas les fichiers et répertoires sous forme de chaînes et simplement les concaténer avec une barre oblique entre les deux. Perl:

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

Rappelez-vous que Windows a des volumes:

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

Lors de l'exécution d'autres programmes, essayez de ne pas impliquer la coquille. En Perl, lorsque vous exécutez une commande avec la fonction system, vous pouvez facilement se tromper avec:

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

Au lieu de cela, vous pouvez exécuter le système avec une liste comme argument: l'exécutable et les arguments étant des chaînes distinctes. Dans ce cas, le shell n'intervient pas et vous n'avez pas d'ennuis concernant l'échappement du shell ou les espaces dans les noms de fichiers.

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

Il y a un tas de portabilité nits documentées dans le manuel perlport.

2

Je ne connais pas assez pour commenter les approches Python à ce problème, donc je ne le ferai pas.

La plupart des choses dans Perl fonctionneront simplement. Il y a quelques pièges faciles à éviter.

Voici quelques choses que je suis venu à travers les années, je travaille avec Win32 Perl:

  • Utilisez 3 sous forme d'argument de open. La forme à deux arguments peut avoir des problèmes avec des espaces dans les chemins. (Vous devriez déjà le faire de toute façon.)
  • Assurez-vous que le cas est correct lorsque vous utilisez un module. use Warnings; semblera fonctionner, mais en réalité, il échouera.
  • select fonctionne uniquement sur les sockets réels sous Windows. Vous ne pouvez pas l'utiliser sur un autre type de poignée. Utilisez File::Spec pour gérer les chemins d'accès aux fichiers.
  • Lorsque vous ouvrez une poignée de fichier CRLF sera automatiquement convertie en LF terminaisons de ligne que le handle est lu. LF est remplacé par CRLF à l'écriture. Si vous voulez éviter cela, utilisez binmode sur la poignée pour empêcher la traduction.
  • Si vous devez passer des arguments via un shell, placez des guillemets autour de chaque argument. Cela permettra d'éviter les erreurs dues aux espaces dans les noms de fichiers.

Voir perlport pour plus d'informations sur les différentes fonctions.

Questions connexes