Question

I used to add shebang line at top of Python script as,

#!/usr/bin/python
...

And I can execute the my.py file by,

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

But after compiled to bytecode, the script can only be executed by python and the shebang does not work anymore.

python my.pyc

Is there anyway to make shebang workable to compiled python script?

./my.pyc
Was it helpful?

Solution

Shebang works only for text scripts, not binary files. Nevertheless, you can use binfmt_misc to execute *.pyc files directly, as reported in this Python ML thread:

Linux, you can use binfmt_misc to make executables out of pyc code. Run:

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)

once on your Linux system (or, rather, at boot time), and all pyc files become executable (if the x bit is set).

In Debian, installing the binfmt-support package will do that for you.

(emphasis is mine, note that this will apply to all Debian derivatives, including Ubuntu. The same solution works in Fedora too).

OTHER TIPS

No. But you can use other OS-specific mechanisms for invoking arbitrary executable files, e.g. binfmt_misc.

Here is an updated python 3 version of Stefano Sanfilippo's answer:

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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top