【问题标题】:how to make a python or perl script portable to both linux and windows?如何使 python 或 perl 脚本可移植到 linux 和 windows?
【发布时间】:2011-03-02 12:09:30
【问题描述】:

我想知道如何使 python 脚本可移植到 linux 和 windows?

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

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

perl 脚本的解决方案是否相同?

感谢和问候!

【问题讨论】:

    标签: python perl scripting cross-platform shebang


    【解决方案1】:

    我没有足够的知识来评论解决这个问题的 Python 方法,所以我不会。

    Perl 中的大多数东西都能正常工作。有一些陷阱很容易避免。

    以下是我在使用 Win32 Perl 的这些年中遇到的一些事情:

    • 使用open 的3 个参数形式。两个参数形式可能会在路径中出现空格问题。 (无论如何,您应该已经这样做了。)
    • 确保在使用模块时大小写正确。 use Warnings; 看起来可以工作,但实际上它会失败。
    • select 仅适用于 Windows 下的实际套接字。您不能在任何其他类型的手柄上使用它。
    • 使用File::Spec 管理文件路径。
    • 当您打开文件句柄时,CRLF 将在读取句柄时自动转换为 LF 行结尾。 LF 在写入时更改为 CRLF。如果您想避免这种情况,请在句柄上使用binmode 以防止翻译。
    • 如果您需要通过 shell 传递参数,请在每个参数周围加上双引号。这将防止由于文件名中的空格而导致的错误。

    有关各个功能的详细信息,请参阅perlport

    【讨论】:

      【解决方案2】:

      确保您不将文件和目录作为字符串处理,而只是在它们之间用斜线连接它们。 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 手册中记录了许多可移植性问题。

      【讨论】:

        【解决方案3】:

        Windows 将忽略 shebang(毕竟这是一个注释);在 Windows 中,您需要将 .py 扩展名与注册表中的 Python 可执行文件相关联,但您完全可以将 shebang 保持打开状态,它在那里完全无害。

        有许多特定于平台的点点滴滴(许多只存在于 Unix 上,msvcrt 只存在于 Windows 上)所以如果你想要便携,你应该放弃这些;有些是微妙的不同(例如subprocess.Popenmmap 的详细精确行为)——这些都是非常先进的东西,文档将指导您。如果您正在执行(通过subprocess 或其他方式)外部命令,当然最好确保它们在两个平台上都存在,或者检查您所在的平台并在每种情况下使用不同的外部命令。

        请记住始终使用/ \,作为路径分隔符(正斜杠在两个平台上都有效,反斜杠仅适用于windows),并注意每个文件是否你打开的是二进制或文本。

        我想就是这样......

        【讨论】:

        • 更好的是,使用os.path.sep 常量作为路径分隔符。
        • 谢谢,亚历克斯!如果 shebang 在 Windows 中被忽略,那么为什么会有这个问题“我如何在 Apache 2 的 Windows 上忽略 Perl shebang?”。见stackoverflow.com/questions/2036577/…
        • @Tim,虽然 Windows 本身忽略了 shebang,但在 Windows 下运行的程序当然可以看到该行 - 就像文本编辑器一样,Web 服务器也是如此。 Windows 上的 Apache 有自己的 shebang 解释——但处理这个问题是关于 apache 配置的系统管理问题,与 Python 或实际上的 stackoverflow 无关(这是一个服务器故障问题)。
        • @dan04 os.path.join() 更好。
        【解决方案4】:

        shebang 行将被 Perl 或 Python 解释为注释。唯一赋予它特殊含义的是 UNIX/Linux shell;它在 Windows 上被忽略。 Windows 知道使用哪个解释器来运行文件的方式是通过注册表中的文件关联,这是一种完全不同的机制。

        【讨论】:

        • 注意非常正确。 perl 将在 shebang 行中查找标志。尝试运行一个包含 #! perl -p 的文件
        • 确实,如果您创建一个以#! python 开头的 .pl 文件,那么 perl 将调用 python。
        • 是的,我忘了。 (我对 Python 太习惯了,AFAIK 完全忽略了 shebang 行)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 2014-11-01
        • 1970-01-01
        相关资源
        最近更新 更多