用于编译Python代码的Shebang

用于编译Python代码的Shebang,python,shebang,Python,Shebang,我曾经在Python脚本顶部添加shebang行,如下所示: #!/usr/bin/python ... 我可以通过以下方式执行my.py文件: chmod a+r my.py ./my.py 但在编译成字节码后,脚本只能由python执行,shebang不再工作 python my.pyc 是否有任何方法可以使shebang对编译后的python脚本有效 ./my.pyc 不可以。但是您可以使用其他特定于操作系统的机制来调用任意可执行文件,例如.Shebang仅适用于文本脚本,而不适用

我曾经在Python脚本顶部添加shebang行,如下所示:

#!/usr/bin/python
...
我可以通过以下方式执行my.py文件:

chmod a+r my.py
./my.py
但在编译成字节码后,脚本只能由python执行,shebang不再工作

python my.pyc
是否有任何方法可以使shebang对编译后的python脚本有效

./my.pyc

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

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

在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支持包将为您做到这一点。


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

以下是更新的python 3版本的答案:


您不应该执行
.pyc
文件,为什么要这样做?我们必须为我们的产品提供已编译的pyc而不是源代码。请记住,使用FOSS工具可以轻松从Python字节码恢复完整的源代码(包括docstring)。有一些DIY技术使反编译更加困难,但Python没有真正的模糊器。当然,这并不是说您应该分发完整的源代码,但请记住,反转pyc几乎是微不足道的。对于delivery.pyc,它通常意味着“好的,我知道你可以反编译它,但要知道我不喜欢你这么做。”
importlib.util.MAGIC_NUMBER
是hi Stefano所说的
imp
的新替代品。此方法支持同一主机上的多个python版本(和.pyc),对吗?我可以在procfs中设置python解释器及其选项之一吗?
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)