Run pyc file without specifying python path ?

Barak, Ron Ron.Barak at lsi.com
Sun Aug 2 04:45:09 EDT 2009



> -----Original Message-----
> From: Dave Angel [mailto:davea at dejaviewphoto.com]
> Sent: Thursday, July 30, 2009 20:08
> To: Barak, Ron
> Cc: 'python-list at python.org'
> Subject: Re: Run pyc file without specifying python path ?
>
> Barak, Ron wrote:
> > Hi Dave,
> >
> > On second thoughts, I may have a problem implementing the
> wrapper solution, because my actual test_pyc.pyc, needs to
> parse its command line.
> > Namely, the actual call to test_pyc.pyc looks something like this:
> >
> > $ python  test_pyc.py -U dave -PpasswoRD -C CreateMcGroupOnVolume
> > --SVMs_IPs '10.1.1.1 , 10.1.1.2' -n "host1,host2" -g gn -j
> jn -s svn
> > -t tvn -p pool1 -l -c
> >
> > And I don't know of a way to add these parameters to the "import
> > test_pyc" in wrapper
> >
> > Is there a way to pass information to an imported module ?
> (Sorry if there's an obvious answer, I just cannot figure it out).
> >
> > Bye,
> > Ron.
> >
> >
> >> -----Original Message-----
> >> From: Dave Angel [mailto:davea at dejaviewphoto.com]
> >> Sent: Thursday, July 30, 2009 16:03
> >> To: Barak, Ron
> >> Cc: 'Dave Angel'; 'python-list at python.org'
> >> Subject: RE: Run pyc file without specifying python path ?
> >>
> >> Barak, Ron wrote:
> >>
> >>>> -----Original Message-----
> >>>> From: Dave Angel [mailto:davea at ieee.org]
> >>>> Sent: Wednesday, July 29, 2009 21:05
> >>>> To: Barak, Ron
> >>>> Cc: 'python-list at python.org'
> >>>> Subject: Re: Run pyc file without specifying python path ?
> >>>>
> >>>> Barak, Ron wrote:
> >>>>
> >>>>
> >>>>> Hi,
> >>>>>
> >>>>> I wanted to make a python byte-code file executable,
> >>>>>
> >>>>>
> >>>> expecting to be able to run it without specifying
> "python" on the
> >>>> (Linux bash) command line.
> >>>>
> >>>>
> >>>>> So, I wrote the following:
> >>>>>
> >>>>> [root at VMLinux1 python]# cat test_pyc.py #!/usr/bin/env python
> >>>>>
> >>>>> print "hello"
> >>>>> [root at VMLinux1 python]#
> >>>>>
> >>>>> and made its pyc file executable:
> >>>>>
> >>>>> [root at VMLinux1 python]# ls -ls test_pyc.pyc
> >>>>> 4 -rwxr-xr-x  1 root root 106 Jul 29 14:22 test_pyc.pyc
> >>>>> [root at VMLinux1 python]#
> >>>>>
> >>>>> So, I see:
> >>>>>
> >>>>> [root at VMLinux1 python]# file test_pyc.py*
> >>>>> test_pyc.py:  a python script text executable
> >>>>> test_pyc.pyc: python 2.3 byte-compiled
> >>>>> [root at VMLinux1 python]#
> >>>>>
> >>>>> If I try to do the following, no problem:
> >>>>>
> >>>>> [root at VMLinux1 python]# python test_pyc.pyc hello
> >>>>> [root at VMLinux1 python]#
> >>>>>
> >>>>> However, the following fails:
> >>>>>
> >>>>> [root at VMLinux1 python]# ./test_pyc.pyc
> >>>>> -bash: ./test_pyc.pyc: cannot execute binary file
> >>>>> [root at VMLinux1 python]#
> >>>>>
> >>>>> Is there a way to run a pyc file without specifying the
> >>>>>
> >>>>>
> >>>> python path ?
> >>>>
> >>>>
> >>>>> Bye,
> >>>>> Ron.
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>> I don't currently run Unix, but I think I know the problem.
> >>>>
> >>>> In a text file, the shell examines the first line, and if
> >>>>
> >> it begins
> >>
> >>>> #!
> >>>> it's assumed to point to the executable of an
> interpreter for that
> >>>> text file.  Presumably the same trick doesn't work for a
> .pyc file.
> >>>>
> >>>> Why not write a trivial wrapper.py file, don't compile
> it, and let
> >>>> that invoke the main code in the .pyc file?
> >>>>
> >>>> Then make wrapper.py executable, and you're ready to go.
> >>>>
> >>>> DaveA
> >>>>
> >>>>
> >>>>
> >>>>
> >>> Hi Dave,
> >>> Your solution sort of defeats my intended purpose (sorry
> >>>
> >> for not divulging my 'hidden agenda').
> >>
> >>> I wanted my application to "hide" the fact that it's a
> >>>
> >> python script, and look as much as possible like it's a compiled
> >> program.
> >>
> >>> The reason I don't just give my user a py file, is that I
> >>>
> >> don't want a cleaver user to change the innards of the script.
> >>
> >>> On the other hand, I don't want to make a compiled
> >>>
> >> (freezed?) version of the application, because it'll grow the
> >> resulting file significantly, and I don't have the
> experience to know
> >> how it will run on different Linuxes.
> >>
> >>> Bye,
> >>> Ron.
> >>>
> >>>
> >> Most of the other answers basically paraphrased my suggestion of
> >> making a wrapper file, not compiling it, and making it
> executable.
> >> With that
> >> approach, the user just types   "wrapper.py" on his command line.
> >>
> >> And wrapper.py only needs two lines, a shebang, and an
> import, no big
> >> deal if the user modifies it.  The rest of your code can be .pyc
> >> files.
> >>
> >> Steven makes some good points.  You have to define what level of
> >> clever you're protecting from.  A determined hacker will get in no
> >> matter what you do, unless you want to ship the program in a
> >> proprietary embedded system, encased in epoxy.
> >> Further, if you have an extension of .py or .pyc, a knowledgeable
> >> hacker will know it's probably python.
> >>
> >> You imply you want it to run unmodifed on multiple unknown Linux
> >> versions.  I think that lets out binfmt solutions.
> >> That means you need to test and support not only multiple Linux
> >> implementations, but multiple Python versions, because who
> knows what
> >> the user may have installed.  I think you need to rethink your
> >> support strategy.  And maybe concentrate on being able to detect
> >> change, rather than prevent it.
> >>
> >> DaveA
> >>
> >>
> >>
> >>
> (Please don't top-post.  It puts responses out of order)
>
> You don't have to do anything special.  Any module can import
> sys, and parse sys.argv, as long as it wasn't yet modified.
>
> DaveA
>

Hi Dave,

It seems like I don't understand your solution.
I use the (appatched) soapAPI.py as the wrapper to parsing.pyc.
However, if I do (for instance):

$ python -u parsing.pyc -U aaa

The last line of the output is (as expected):

return_code: 12 ; params: {'username': 'aaa'}

But, if I try the following:

$ soapAPI.py -U aaa

I don't get this line. Only the output to stderr gets printed to the screen.

Bye,
Ron.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090802/696a0c1b/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: soapAPI.py
Type: application/octet-stream
Size: 65 bytes
Desc: soapAPI.py
URL: <http://mail.python.org/pipermail/python-list/attachments/20090802/696a0c1b/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: parsing.py
Type: application/octet-stream
Size: 9542 bytes
Desc: parsing.py
URL: <http://mail.python.org/pipermail/python-list/attachments/20090802/696a0c1b/attachment-0001.obj>


More information about the Python-list mailing list