Ok, very strange but at least we're getting some data :)...  can you send the 
command line you're building each pyc.py with?  And could you modify each 
pyc.py so the call before clr.CompileModules we print out the args like:

    print main_name, files
    clr.CompileModules(output + '.dll', mainModule = main_name, *files)

I'm hoping that we'll see os.py in there somewhere.

From: users-boun...@lists.ironpython.com 
[mailto:users-boun...@lists.ironpython.com] On Behalf Of Ken MacDonald
Sent: Friday, October 08, 2010 11:55 AM
To: Discussion of IronPython
Subject: Re: [IronPython] change in standard library behavior for compiled 
.exe/.dll???

Hi Dino,
We are definitely creating both the stub .exe and .dll, and I have now verified 
using the ildasm tool that the older version .dll created by the 2.6 pyc.py 
DOES contain the required std lib modules (os, ntpath, fractions, decimal,... 
were all in there), and that the 2.7-compiled .dll does NOT contain any of the 
modules.
Ken
On Fri, Oct 8, 2010 at 2:16 PM, Dino Viehland 
<di...@microsoft.com<mailto:di...@microsoft.com>> wrote:
Are you not creating an EXE?  My theory here is that changing the CWD is 
causing us to not pick up the std lib because I don't think the DLL has ever 
included the std lib.

From: 
users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com> 
[mailto:users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com>]
 On Behalf Of Ken MacDonald
Sent: Friday, October 08, 2010 7:28 AM

To: Discussion of IronPython
Subject: Re: [IronPython] change in standard library behavior for compiled 
.exe/.dll???

Well, just was looking at the pyc.py again; the change you suggest is actually 
in the GenerateExe method, so should have no effect on what is contained in the 
.dll.

The .dll is actually generated by this code:

    print "Output:\n\t%s" % output
    print "Target:\n\t%s" % target
    print 'Platform:\n\t%s' % platform
    print 'Machine:\n\t%s' % machine

    print 'Compiling...'
    clr.CompileModules(output + '.dll', mainModule = main_name, *files)

so I'm getting the feeling that something changed in the CompileModules method 
between 2.6 and 2.7 such that it's no longer tracking down and including the 
std lib references.
Ken
On Fri, Oct 8, 2010 at 10:08 AM, Ken MacDonald 
<drken...@gmail.com<mailto:drken...@gmail.com>> wrote:
HI Dino,
Tried your change, it came up with an error on the statement below:
TypeError: EmitCall() takes exactly 3 arguments (1 given)

Not sure what the other args should be... it did seem to create a new myapp.dll 
despite the error, but it was the same size (1.2 MB) as the new version 2.7 
dll, and was still missing std lib components. I'm not sure that this is valid, 
considering the error in the EmitCall() noted above.

I did do a primitive analysis of the app to find out which std lib components 
it references; found roughly 25 of them, and as a test, incorporated the 
largest 10 or so explicitly in the compile; the size of the resulting dll was 
about 2.1 MB (much closer to the 2.6 dll version size, 2.9 MB), and was able to 
run it successfullyagainst a stripped-down std lib where I had removed those 10 
files. It seems fairly clear to me that the 2.6 version dll did include the 
components it required from the std lib.

Starting to look really promising; not quite there yet!
Ken

On Thu, Oct 7, 2010 at 8:06 PM, Dino Viehland 
<di...@microsoft.com<mailto:di...@microsoft.com>> wrote:
I think these changes came about due to this thread: 
http://www.mail-archive.com/users@lists.ironpython.com/msg08794.html where 
there was an issue w/ relative paths and starting an app.

And you may have found the root of the problem but you didn't quote the code 
change.  There's these additional lines:

   gen.EmitCall(OpCodes.Call, 
clr.GetClrType(System.IO.DirectoryInfo).GetMethod("get_FullName"), ())
   gen.EmitCall(OpCodes.Call, 
clr.GetClrType(System.Environment).GetMethod("set_CurrentDirectory"), ())

which might be causing the problem as we change the CWD before we really kick 
things off.  Does replacing the set_CurrentDirectory line in pyc.py with:

   gen.EmitCall(OpCodes.Pop)

possibly fix things for you (that'll make that a NOP but should leave all the 
other changes in place)?

From: 
users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com> 
[mailto:users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com>]
 On Behalf Of Ken MacDonald
Sent: Wednesday, October 06, 2010 1:26 PM
To: Discussion of IronPython

Subject: Re: [IronPython] change in standard library behavior for compiled 
.exe/.dll???

As an FYI, the following change was made from the IP 2.6 version of pyc.py to 
the IP 2.7 version (newer version shown first):

<     # get the ScriptCode assembly...
<     gen.EmitCall(OpCodes.Call, 
clr.GetClrType(Assembly).GetMethod("GetEntryAssembly"), ())
<     gen.EmitCall(OpCodes.Callvirt, 
clr.GetClrType(Assembly).GetMethod("get_Location"), ())
---
>     # get the ScriptCode assembly...
>     gen.EmitCall(OpCodes.Call, 
> clr.GetClrType(Assembly).GetMethod("GetEntryAssembly"), ());
>     gen.EmitCall(OpCodes.Call, 
> clr.GetClrType(Assembly).GetMethod("get_CodeBase"), ());
>     gen.Emit(OpCodes.Newobj, clr.GetClrType(System.Uri).GetConstructor( (str, 
> ) ));
>     gen.EmitCall(OpCodes.Call, 
> clr.GetClrType(System.Uri).GetMethod("get_LocalPath"), ());

Don't know what these things do at this point, but wondering if the changes 
have to do with compiling the entire code tree into the application .DLL???
Ken
On Wed, Oct 6, 2010 at 4:04 PM, Ken MacDonald 
<drken...@gmail.com<mailto:drken...@gmail.com>> wrote:
Hi Dino,
On Wed, Oct 6, 2010 at 2:57 PM, Dino Viehland 
<di...@microsoft.com<mailto:di...@microsoft.com>> wrote:
How are you distributing your app?  I'm assuming you're going to have something 
like:

MyApp\
MyApp.exe
MyApp.dll
IronPython.dll
IronPython.Modules.DLL
...

This is exactly how we have been distributing our app up to IP 2.6 with .NET 
3.5. We also have another DLL with our resources in it; XAML, icons, image 
files, but no code per se. We have been distributing it this way to customer 
systems that do NOT have IronPython installed, or any sign of the std. library, 
or "os.py" specifically, and it's been working really, really well.

We're trying to understand what changed moving to IP 2.7 and .NET 4.0 that we 
should have to care about distributing the std. library now. The way it was 
before was quite simple and robust; deliver a small handful of files and it 
just worked, very easy to keep track of. Now instead of distributing 5 files, 
we suddenly need to distribute 500??? We've figured out that it certainly COULD 
work as described below, but it seems like a giant step backwards on several 
fronts, including the potential for folks to maliciously or accidentally tamper 
with the std lib. sources and affect the functioning of our app. So, how do we 
get back to the old/better functionality?

On a slightly related note, our app imports some package directories in 
addition, e.g. "import ctypes". When python encounters a directory import, it 
looks for __init__.py in the directory, and derives the package import 
directions from there, as I understand it. However, I can't specify the 
"ctypes" directory as an argument to the pyc.py compile app; just causes it to 
croak. If I explicitly specified paths like "lib\ctypes\__init__.py" and the 
other files in the ctypes subdirectory, it seems like "import ctypes" would 
have no clue that the __init__.py that was compiled in had anything to do with 
the "ctypes" package, as the path names are presumably irrelevant to the 
compiler as long as they specify a python file. I'm considering mod'ing pyc.py 
to be able to incorporate a list of std lib modules to compile in: simple 
enough for the standalone files like "os.py", but the compile modules don't 
seem to be able to grok what to do with a package subdirectory.
Ken



You should be able to also distribute the standard library and just drop it 
into a Lib directory next to IronPython.dll:
MyApp\
MyApp.exe
MyApp.dll
IronPython.dll
IronPython.Modules.DLL
...
                Lib\
                                os.py

That lib dir should be on sys.path at startup and so it should be available for 
importing.

From: 
users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com> 
[mailto:users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com>]
 On Behalf Of Ken MacDonald
Sent: Wednesday, October 06, 2010 11:42 AM
To: Michael Foord

Cc: Discussion of IronPython
Subject: Re: [IronPython] change in standard library behavior for compiled 
.exe/.dll???

Hi Michael,

I started out on implementing this, but I am importing maybe a dozen of the 
std. library modules, which then import others, and so on. It appears that 
eventually, most of the std modules would have to be imported explicitly 
(perhaps 400 or so files) which might make for a somewhat cumbersome command 
line, incidentally also about 20K characters too long :-). I'm hoping to find a 
way to get this to work as well as it did under IP 2.5 / .NET 3.5.

Noah: what kind of problems are YOU having with pyc.py under 4.0? Maybe one of 
us can suggest something if we have an understanding of what you're trying to 
do.
Ken
On Wed, Oct 6, 2010 at 7:08 AM, Michael Foord 
<mich...@voidspace.org.uk<mailto:mich...@voidspace.org.uk>> wrote:
On 05/10/2010 22:27, Ken MacDonald wrote:
I've been looking at the .exe's we built - using pyc.py - with IP 2.5/.Net 3.5 
and IP2.7 / .NET 4.0. In the 2.7 .exe, it appears that the imports (like "os") 
are not being built into the .exe/.dll, but instead are required to be imported 
in source form, e.g. "os.py" must be somewhere on sys.path. In the IP 2.5 
.exe's we had been building, they would run fine on machines without the IP 
standard library installed at all, in other words, with "os.py" not present on 
the machine at all. We did notice that the .exe in question went from being 2.9 
MB in it's IP 2.5 incarnation, down to 1.2 MB in the IP 2.7 version, and the 
newer version requires that the source code for the IP standard library be on 
the path. Is this a deliberate change in behavior? We never had to package the 
standard library source when we sent out .exe's to customers before

Hmmm... I'm pretty sure I always had to explicitly compile and bundle the 
standard library with previous versions of Python. Odd. Anyway, the simple 
solution is to ensure that you add any standard library modules you use to the 
set you compile and ship.


All the best,

Michael Foord

>"os" is not an assembly but a Python module from the standard library. You 
>need to ensure >that the Python standard library (or the parts that you use 
>and their dependencies) is on the >path.

All the best,

Michael Foord
and how do I ensure it gets found from my .exe - is there a specific env. 
variable, or the Windows %PATH% e.v., or something I haven't AddReference'd 
to????
Thanks,
Ken



_______________________________________________

Users mailing list

Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>

http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


--

http://www.voidspace.org.uk/blog



READ CAREFULLY. By accepting and reading this email you agree,

on behalf of your employer, to release me from all obligations

and waivers arising from any and all NON-NEGOTIATED agreements,

licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap,

confidentiality, non-disclosure, non-compete and acceptable use

policies ("BOGUS AGREEMENTS") that I have entered into with your

employer, its partners, licensors, agents and assigns, in

perpetuity, without prejudice to my ongoing rights and privileges.

You further represent that you have the authority to release me

from any BOGUS AGREEMENTS on behalf of your employer.



--

http://www.voidspace.org.uk/blog



READ CAREFULLY. By accepting and reading this email you agree,

on behalf of your employer, to release me from all obligations

and waivers arising from any and all NON-NEGOTIATED agreements,

licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap,

confidentiality, non-disclosure, non-compete and acceptable use

policies ("BOGUS AGREEMENTS") that I have entered into with your

employer, its partners, licensors, agents and assigns, in

perpetuity, without prejudice to my ongoing rights and privileges.

You further represent that you have the authority to release me

from any BOGUS AGREEMENTS on behalf of your employer.


_______________________________________________
Users mailing list
Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com



_______________________________________________
Users mailing list
Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com



_______________________________________________
Users mailing list
Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to