Executable standalone *.pyc after inserting "#!/usr/bin/python" orother options

E

epsilon

All:

I've been playing with "Lua" and found something really cool that I'm
unable to do in "Python". With "Lua", a script can be compiled to byte
code using "luac" and by adding "#!/usr/bin/lua" at the top of the
binary, the byte code becomes a single file executable. After I found
this trick, I ran back to "Python" to give it a try. Well... it
didn't work. Is this possible? There are tools which insert "python"
and related modules inside the byte code, but this is not the
requirement for this situation. The required solution is to insert "#!/
usr/bin/python" (or some string) at the top of a *.pyc byte code file
and run it as standalone executable. I'm excited about the
possibility and interested in hearing your thoughts.

Thank you,
Christopher Smiga
 
M

Martin v. Loewis

I've been playing with "Lua" and found something really cool that I'm
unable to do in "Python". With "Lua", a script can be compiled to byte
code using "luac" and by adding "#!/usr/bin/lua" at the top of the
binary, the byte code becomes a single file executable. After I found
this trick, I ran back to "Python" to give it a try. Well... it
didn't work. Is this possible?

In Python, a different approach will work, depending on the operating
system.

E.g. on 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.

Do "ls /proc/sys/fs/binfmt_misc/" to see what binary types are
already supported on your system.

HTH,
Martin

P.S. The approach you present for Lua indeed does not work for
Python.
 
E

epsilon

I've been playing with "Lua" and found something really cool that I'm
unable to do in "Python". With "Lua", a script can be compiled to byte
code using "luac" and by adding "#!/usr/bin/lua" at the top of the
binary, the byte code becomes a single file executable. After I found
this trick, I ran back to "Python" to give it a try.  Well...  it
didn't work. Is this possible?

In Python, a different approach will work, depending on the operating
system.

E.g. on 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.

Do "ls /proc/sys/fs/binfmt_misc/" to see what binary types are
already supported on your system.

HTH,
Martin

P.S. The approach you present for Lua indeed does not work for
Python.


Martin,

This works great! Do you or anyone else have information on how to do
the same thing for Windows and/or Solaris.

Thank you again,
Christopher
 
L

Lie Ryan

P.S. The approach you present for Lua indeed does not work for
Python.

Actually the approach should work, though with a little workaround; you
can write your wrapper (e.g. #!/usr/bin/mypython) that simply strips the
first line and pass the file to the real python interpreter
(/usr/bin/python or whatever).

And I think it would be trivial to patch python interpreter to support
loading of #!-ed .pyc.
 
M

Martin v. Loewis

This works great! Do you or anyone else have information on how to do
the same thing for Windows and/or Solaris.

On Windows, just associate the .pyc extension with Python - the standard
installation will already do that.

On Solaris, I don't think something like this is supported.

Regards,
Martin
 
S

schmeii

All:

I've been playing with "Lua" and found something really cool that I'm
unable to do in "Python". With "Lua", a script can be compiled to byte
code using "luac" and by adding "#!/usr/bin/lua" at the top of the
binary, the byte code becomes a single file executable. After I found
this trick, I ran back to "Python" to give it a try.  Well...  it
didn't work. Is this possible?

You can't add a string on top of a pyc file but you can add one in a
zipped file. For an example, see http://www.noah.org/wiki/Python_zip_exe
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top