Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使python或perl脚本可移植到linux和windows?_Python_Perl_Scripting_Cross Platform_Shebang - Fatal编程技术网

如何使python或perl脚本可移植到linux和windows?

如何使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

我想知道如何将python脚本移植到linux和windows

我看到的一个问题是shebang。如何编写shebang以便脚本可以在windows和linux上运行

除了shebang,还有其他我应该知道的问题吗

perl脚本的解决方案相同吗


谢谢和问候

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的几年中,我遇到了以下几件事:

  • 使用
    open
    的3参数形式。双参数形式可能存在路径中的空格问题。(无论如何,您应该已经这样做了。)
  • 使用模块时,请确保案例正确<代码>使用警告看起来会工作,但实际上会失败
  • select
    仅适用于Windows下的实际套接字。你不能在任何其他类型的手柄上使用它
  • 使用
    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无关(这是一个服务器故障问题)。@dan04
os.path.join()
,甚至更好。请注意,这是事实。perl将在shebang行中查找标志。尝试运行包含
#的文件!perl-p
如果您创建一个.pl文件来启动
#!python
然后perl将调用python.ah true,我忘记了。(我太习惯Python了,AFAIK完全忽略了shebang行)