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