我想知道如何让python脚本同时移植到linux和windows?
我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行?
除了shebang还有其他我应该知道的问题吗?
perl脚本的解决方案是否相同?
谢谢和问候!
答案 0 :(得分:14)
Windows会忽略shebang(毕竟是评论);在Windows中,您需要将.py
扩展名与注册表中的Python可执行文件相关联,但是您可以完全放弃shebang,它将完全无害。
有许多特定于平台的零碎(很多只存在于Unix上,msvcrt
只存在于Windows上)所以如果你想要便携,你应该弃用那些;有些是微妙的不同(例如subprocess.Popen
或mmap
的详细精确行为) - 这些都是非常先进的东西,文档会引导你到那里。如果您正在执行(通过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
以阻止翻译。有关各个功能的详细信息,请参阅perlport。