【问题标题】:Shebang for compiled Python code用于编译 Python 代码的 Shebang
【发布时间】:2014-03-16 13:29:09
【问题描述】:

我曾经在 Python 脚本的顶部添加 shebang 行,

#!/usr/bin/python
...

我可以执行 my.py 文件,

chmod a+r my.py
./my.py

但是编译成字节码后,脚本只能被python执行,shebang已经失效了。

python my.pyc

有没有办法让shebang可以编译python脚本?

./my.pyc

【问题讨论】:

  • 你不应该执行.pyc文件,你为什么要这样做?
  • 我们必须提供编译好的pyc,而不是我们产品的源代码。
  • 请记住,可以使用 FOSS 工具从 Python 字节码轻松恢复完整的源代码(包括文档字符串)。有一些 DIY 技术可以使反编译更加困难,但 Python 并没有真正的混淆器。当然,这并不是说您应该分发完整的源代码,但请记住,逆向 pyc 几乎是微不足道的。
  • 您好 Stefano,感谢您的提醒。交付 .pyc 通常意味着“好的,我知道你可以反编译它,但请注意我不喜欢你这样做。”

标签: python shebang


【解决方案1】:

这是Stefano Sanfilippo's答案的更新python 3版本:

import imp,sys,string
magic = "".join(["\\x%.2x" % c for c in imp.get_magic()])
reg = ':pyc:M::%s::%s:' % (magic, sys.executable) 
open("/proc/sys/fs/binfmt_misc/register","w").write(reg)

【讨论】:

【解决方案2】:

Shebang 仅适用于文本脚本,不适用于二进制文件。不过,您可以使用binfmt_misc 直接执行*.pyc 文件,如this Python ML thread 中所述:

Linux,您可以使用 binfmt_misc 从 pyc 代码中生成可执行文件。运行:

import imp,sys,string
magic = string.join(["\\x%.2x" % ord(c) for c in imp.get_magic()],"") 
reg = ':pyc:M::%s::%s:' % (magic, sys.executable) 
open("/proc/sys/fs/binfmt_misc/register","wb").write(reg)

在您的 Linux 系统上一次(或者更确切地说,在启动时),然后所有 pyc 文件变为可执行文件(如果设置了 x 位)。

在 Debian 中,安装 binfmt-support 包将为您完成此任务。

(重点是我,请注意,这将适用于所有 Debian 衍生产品,包括 Ubuntu。同样的解决方案也适用于 Fedora)。

【讨论】:

  • 嗨斯特凡诺。此方法支持同一主机上的许多 python 版本(和 .pyc),对吗?我可以在 procfs 中设置 python 解释器及其选项之一吗?
【解决方案3】:

没有。但是您可以使用其他特定于操作系统的机制来调用任意可执行文件,例如binfmt_misc.

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多