我想知道如何使 python 脚本可移植到 linux 和 windows?
我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行?
除了shebang之外还有其他我应该知道的问题吗?
perl 脚本的解决方案是否相同?
谢谢并恭祝安康!
我想知道如何使 python 脚本可移植到 linux 和 windows?
我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行?
除了shebang之外还有其他我应该知道的问题吗?
perl 脚本的解决方案是否相同?
谢谢并恭祝安康!
Windows 将忽略 shebang(毕竟,这是一个评论);在 Windows 中,您需要将.py
扩展名与注册表中的 Python 可执行文件相关联,但您完全可以将 shebang 保持打开状态,在那里它将完全无害。
有许多特定于平台的点点滴滴(许多只存在于 Unix 上,msvcrt
只存在于 Windows 上),所以如果你想要便携,你应该放弃这些;有些是微妙的不同(例如subprocess.Popen
or的详细精确行为mmap
)-它们都是非常高级的东西,文档将指导您。如果您正在执行(通过subprocess
或以其他方式)外部命令,您最好确保它们在两个平台上都存在,当然,或者检查您所在的平台并在每种情况下使用不同的外部命令。
请记住始终使用/
, not \
, 作为路径分隔符(正斜杠适用于两个平台,反斜杠仅适用于 Windows),并注意您打开的每个文件是二进制文件还是文本文件。
我想大概就是这样...
确保您不将文件和目录作为字符串处理,而只是在它们之间用斜线连接它们。珀尔:
$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手册中记录了许多可移植性细节。
shebang 行将被 Perl 或 Python 解释为注释。唯一赋予它特殊含义的是 UNIX/Linux shell。它在 Windows 上被忽略。Windows 知道使用哪个解释器来运行文件的方式是通过注册表中的文件关联,这是一种完全不同的机制。
我没有足够的知识来评论解决这个问题的 Python 方法,所以我不会。
Perl 中的大多数东西都可以正常工作。有一些很容易避免的陷阱。
以下是我在使用 Win32 Perl 的这些年中遇到的一些事情:
open
。两个参数形式可能会在路径中出现空格问题。(无论如何,您应该已经这样做了。)use Warnings;
看起来会起作用,但实际上它会失败。select
仅适用于 Windows 下的实际套接字。您不能在任何其他类型的手柄上使用它。File::Spec
管理文件的路径。CRLF
时会自动转换为LF
行尾。 LF
更改为CRLF
on write。如果您想避免这种情况,binmode
请在句柄上使用以防止翻译。有关各个函数的更多信息,请参见perlport。