Cool - that's what I love about the open source community. You can see the code, fix the code, and share the fix.

Massa, Harald Armin wrote:
Grant,

for your problems with the assertion there is a patch...

- -----------------------------------------------------------------------------------------------

in Version 213 of pywin32 within

win32com\client\genpy.py

on line 814, within def do_gen_file_header(self): there is the assertion:

# You must provide a file correctly configured for writing unicode.
# We assert this is it may indicate somewhere in pywin32 that needs
# upgrading.
assert self.file.encoding, self.file


But using makepy.py via
makepy.py -v -o OLE_Excel11.py "Microsoft Excel 11.0 Object Library"

this assertion fails ... as self.file.encoding is None

The culprit is makepy.py itself:

starting at line 367ff there is:

    if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        f = open(outputName, "w")
    else:
        f = None

and this "f" will have encoding=None

I patched this to:

if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        #~ f = open(outputName, "w")
        import codecs
        f= codecs.open(outputName, mode="w",encoding="mbcs")
    else:
        f = None

use codecs to create a file with mbcs encoding. After this, I get a nice create ole_excel11.py file, with the good line
# -*- coding: mbcs -*-

at the beginning.

I propose to put this fix into makepy.py for everybody; (any rights you need are hereby granted) - -----------------------------------------------------------------------------------------------

(of which you could not know; I guess it got lost somewhere between Europe and Australia, where Mark Hammond, the master of pywin32, was before)

Now I have put out this patch to the public, for others to enjoy untill it may or may not be worked into makepy.py

best wishes,

Harald

On Thu, Aug 27, 2009 at 1:51 PM, Grant Paton-Simpson <gr...@p-s.co.nz <mailto:gr...@p-s.co.nz>> wrote:

    Hi Harald,

    I managed to make a file containing everything I needed.  NB the
    command
    is makepy.py not makepy.  There was, however, an issue with genpy.py
    asserting there had to be a self.file.encoding even though I couldn't
    see where that was set.  I temporarily commented that assert out.
     File
    creation then worked.  I then took out the small portion of the
    script I
    needed - all the data type constants - and put those in my own
    module. Success!

    For the benefit of others, the reason you don't have to specify the
    library e.g. ActiveX 2.8, is that you will be prompted for it via
    a pop
    up GUI.


    All the best, Grant


    Massa, Harald Armin wrote:
    > Grant,
    >
    > that is possible. Just read the makepy.py script within
    > win32com.client, and you will find that someway down main() there is
    >
    > ---------
    > GenerateFromTypeLibSpec(arg, f, verboseLevel = verboseLevel,
    > bForDemand = bForDemand, bBuildHidden = hiddenSpec)
    > ---------
    >
    > which does this.
    >
    > BUT, for "static" usage of makepy-COM-Mappings I suggest to make
    > makepy output it's results in a named file
    >
    > makepy -o ADO28.py
    >
    > and furtheron import that ADO28 file to access the variables. That
    > does also work  with Excel and Word, and I am used to
    >
    > import ExcelXX as Excel
    > ec=Excel.constants
    >
    > and further on us ec.* for excel constants.
    >
    > Best wishes,
    >
    > HArald
    >
    > On Thu, Aug 27, 2009 at 2:51 AM, Grant Paton-Simpson
    <gr...@p-s.co.nz <mailto:gr...@p-s.co.nz>
    > <mailto:gr...@p-s.co.nz <mailto:gr...@p-s.co.nz>>> wrote:
    >
    >     Hi,
    >
    >     Basically I want to have an installation package
    automatically run the
    >     COM MakePy utility for the ADO 2.8 library. I believe I need
    to do
    >     this
    >     so that constants like win32com.client.constants.adTinyInt
    will be
    >     available when my application (http://www.sofastatistics.com)
    >     connects to
    >     MS Access and MS SQL Server databases.
    >
    >     Ideally I would have a line doing something like this:
    >
    >     win32com.runmakepy("Microsoft ActiveX Data Objects 2.8
    Library (2.8)")
    >
    >     Is it possible to do this programmatically?
    >
    >
    >     All the best, Grant
    >     _______________________________________________
    >     python-win32 mailing list
    >     python-win32@python.org <mailto:python-win32@python.org>
    <mailto:python-win32@python.org <mailto:python-win32@python.org>>
    >     http://mail.python.org/mailman/listinfo/python-win32
    >
    >
    >
    >
    > --
    > GHUM Harald Massa
    > persuadere et programmare
    > Harald Armin Massa
    > Spielberger Straße 49
    > 70435 Stuttgart
    > 0173/9409607
    > no fx, no carrier pigeon
    > -
    > LASIK good, steroids bad?


    _______________________________________________
    python-win32 mailing list
    python-win32@python.org <mailto:python-win32@python.org>
    http://mail.python.org/mailman/listinfo/python-win32




--
GHUM Harald Massa
persuadere et programmare
Harald Armin Massa
Spielberger Straße 49
70435 Stuttgart
0173/9409607
no fx, no carrier pigeon
-
LASIK good, steroids bad?
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to