如何使python或perl脚本可移植到linux和windows?

时间:2010-06-11 04:53:39

标签: python perl scripting cross-platform shebang

我想知道如何让python脚本同时移植到linux和windows?

我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行?

除了shebang还有其他我应该知道的问题吗?

perl脚本的解决方案是否相同?

谢谢和问候!

4 个答案:

答案 0 :(得分:14)

Windows会忽略shebang(毕竟是评论);在Windows中,您需要将.py扩展名与注册表中的Python可执行文件相关联,但是您可以完全放弃shebang,它将完全无害。

有许多特定于平台的零碎(很多只存在于Unix上,msvcrt只存在于Windows上)所以如果你想要便携,你应该弃用那些;有些是微妙的不同(例如subprocess.Popenmmap的详细精确行为) - 这些都是非常先进的东西,文档会引导你到那里。如果您正在执行(通过subprocess或其他方式)外部命令,您最好确保它们存在于两个平台上,或者检查您所在的平台并在每种情况下使用不同的外部命令。 / p>

请记住始终使用/而不是 \作为路径分隔符(正斜杠在两个平台中都有效,反向斜杠只在Windows中使用),并且要一丝不苟您打开的每个文件是二进制还是文本。

我认为就是这样......

答案 1 :(得分:7)

确保您不将文件和目录作为字符串处理,只需将它们与中间的斜杠连接即可。的Perl:

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

请记住,Windows有卷:

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

运行其他程序时,尽量避免涉及shell。在Perl中,当您使用system函数运行命令时,您可以轻松地弄错:

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

相反,您可以使用列表作为参数运行系统:可执行文件和参数是单独的字符串。在这种情况下,shell不会涉及,并且您不会遇到有关shell转义或文件名中的空格的问题。

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

perlport手册中记录了许多可移植性尼特。

答案 2 :(得分:2)

shebang系列将被解释为Perl或Python的评论。唯一赋予它特殊含义的是UNIX / Linux shell;它在Windows上被忽略了。 Windows知道哪个解释器用于运行文件的方式是通过注册表中的文件关联,完全不同的机制。

答案 3 :(得分:2)

我不太了解这个问题的Python方法,所以我不会。

Perl中的大多数东西都能正常工作。有一些易于避免的陷阱。

以下是我使用Win32 Perl时遇到的一些事情:

  • 使用open的3参数形式。两个参数形式可能会出现路径中的空格问题。 (无论如何你应该已经这样做了。)
  • 使用模块时,请确保大小写正确。 use Warnings;似乎可行,但实际上它会失败。
  • select仅适用于Windows下的实际套接字。你不能在任何其他类型的句柄上使用它。
  • 使用File::Spec管理文件路径。
  • 当您打开文件句柄时,CRLF会在读取句柄时自动转换为LF行结尾。写入时LF更改为CRLF。如果您想避免这种情况,请在句柄上使用binmode以阻止翻译。
  • 如果需要通过shell传递参数,请在每个参数周围加上双引号。这样可以防止文件名中的空格引起的错误。

有关各个功能的详细信息,请参阅perlport