如何使Python或Perl脚本在Linux和Windows上可移植?
我在想,怎么才能让一个Python脚本在Linux和Windows上都能用呢?
我看到的一个问题是shebang。怎么写shebang才能让这个脚本在Windows和Linux上都能运行呢?
除了shebang,还有其他我需要知道的问题吗?
对于Perl脚本,解决办法也是一样的吗?
谢谢,祝好!
4 个回答
在Perl或Python中,开头的那一行(叫做shebang行)会被当作注释来处理。只有在UNIX/Linux系统中,这一行才有特别的意义;在Windows系统上,它会被忽略。Windows是通过注册表中的文件关联来判断用哪个解释器来运行这个文件的,这和UNIX/Linux的方式完全不同。
确保你不要把文件和目录当作字符串来处理,也不要简单地用斜杠把它们连接起来。比如在Perl中:
$path = File::Spec->catfile("dir1", "dir2", "file")
记住,Windows系统有多个盘符:
($volume, $path, $file) = File::Spec->splitpath($full_path);
@directories = File::Spec->splitdir($path);
在运行其他程序时,尽量避免使用命令行。比如在Perl中,当你用system
函数运行一个命令时,很容易出错,比如:
$full_command = 'C:\Documents and Settings/program.exe "arg1" arg2'; # spaces alert!
system($full_command);
相反,你可以用一个列表作为参数来运行system:把可执行文件和参数分开成不同的字符串。这样,命令行就不会参与进来,你也就不用担心命令行转义或者文件名中的空格问题了。
system('C:\Documents and Settings/program.exe', 'arg1', 'arg2');
还有很多关于可移植性的小细节可以在perlport手册中找到。
在Windows系统中,程序会忽略开头的“shebang”(这其实是个注释)。在Windows上,你需要把.py
这个文件扩展名和Python程序关联起来,这样系统才能知道用什么程序来运行这个文件。不过,你可以放心地保留这个“shebang”,它在这里不会造成任何问题。
有很多东西是特定于某个平台的(比如有些只在Unix系统上存在,而msvcrt
只在Windows上有),所以如果你想让你的代码在不同的平台上都能运行,最好避免使用这些特定的东西。有些功能的表现也会有细微的差别(比如subprocess.Popen
或mmap
的具体行为),这些都是比较高级的内容,文档会给你提供指导。如果你通过subprocess
或其他方式执行外部命令,最好确保这些命令在两个平台上都存在,或者先检查你在哪个平台,然后在不同的情况下使用不同的外部命令。
记得始终使用/
作为路径分隔符,而不是 \
(正斜杠在两个平台上都能用,而反斜杠只适用于Windows),而且要仔细确认你打开的每个文件是二进制文件还是文本文件。
我想就这些了……