如何使python或perl脚本可移植到linux和windows?
我想知道如何将python脚本移植到linux和windows 我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行 除了shebang,还有其他我应该知道的问题吗 perl脚本的解决方案相同吗如何使python或perl脚本可移植到linux和windows?,python,perl,scripting,cross-platform,shebang,Python,Perl,Scripting,Cross Platform,Shebang,我想知道如何将python脚本移植到linux和windows 我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行 除了shebang,还有其他我应该知道的问题吗 perl脚本的解决方案相同吗 谢谢和问候 shebang行将被Perl或Python解释为注释。唯一赋予它特殊含义的是UNIX/Linux shell;它在Windows上被忽略。Windows知道使用哪个解释器来运行文件的方式是通过注册表中的文件关联,这是一种完全不同的机制。Win
谢谢和问候 shebang行将被Perl或Python解释为注释。唯一赋予它特殊含义的是UNIX/Linux shell;它在Windows上被忽略。Windows知道使用哪个解释器来运行文件的方式是通过注册表中的文件关联,这是一种完全不同的机制。Windows只会忽略shebang(毕竟,这是一个注释);在Windows中,您需要将
.py
扩展与注册表中的Python可执行文件相关联,但是您完全可以让shebang保持打开状态,在那里它将是完全无害的
有许多特定于平台的部分(许多仅存在于Unix上,msvcrt
仅存在于Windows上),因此如果您想要便携,您应该避免使用这些部分;有些是微妙的不同(例如subprocess.Popen
或mmap
)的详细精确行为——这些都是非常高级的东西,文档将指导您。如果您正在执行(通过子流程
或其他方式)外部命令,当然,您最好确保它们在两个平台上都存在,或者检查您所在的平台,并在每种情况下使用不同的外部命令
请记住始终使用/
,而不是\
,作为路径分隔符(正斜杠在两种平台上都适用,反斜杠仅适用于windows),并仔细检查打开的每个文件是二进制文件还是文本文件
我想就这样吧…确保不要将文件和目录作为字符串处理,而只是在它们之间用斜杠连接起来。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');
手册中记录了许多关于可移植性的细节。我不知道如何评论Python解决这个问题的方法,所以我不会 Perl中的大多数东西都能正常工作。有几个陷阱很容易避免 在使用Win32 Perl的几年中,我遇到了以下几件事:
- 使用
的3参数形式。双参数形式可能存在路径中的空格问题。(无论如何,您应该已经这样做了。)open
- 使用模块时,请确保案例正确<代码>使用警告看起来会工作,但实际上会失败
仅适用于Windows下的实际套接字。你不能在任何其他类型的手柄上使用它select
- 使用
管理文件路径File::Spec
- 打开文件时,句柄
将在读取句柄时自动转换为CRLF
行结尾LF
在写入时更改为LF
。如果要避免这种情况,请在手柄上使用CRLF
,以防止转换binmode
- 如果需要通过shell传递参数,请在每个参数周围加上双引号。这将防止由于文件名中的空格而导致错误
有关单个函数的更多信息,请参见。更好的方法是使用
os.path.sep
常量作为路径分隔符。谢谢,Alex!如果在windows中忽略了shebang,那么为什么会出现这样的问题“如何在使用Apache2的windows上忽略Perl shebang?”。请看。@Tim,虽然Windows本身忽略了shebang,但在Windows下运行的程序当然可以看到这一行,就像文本编辑器一样,web服务器也可以看到这一行。Windows上的Apache有自己的shebang解释——但处理这一问题是Apache配置的系统管理问题,与Python无关,实际上与stackoverflow无关(这是一个服务器故障问题)。@dan04os.path.join()
,甚至更好。请注意,这是事实。perl将在shebang行中查找标志。尝试运行包含#的文件!perl-p
如果您创建一个.pl文件来启动#!python
然后perl将调用python.ah true,我忘记了。(我太习惯Python了,AFAIK完全忽略了shebang行)