[Chicago] Python, VB math simple problem
Robert Ramsdell
rcriii at ramsdells.net
Sun Apr 2 16:37:34 CEST 2006
If VB4 does COM, you can use the pywin32 extensions
(https://sourceforge.net/projects/pywin32/) to expose the python module
as a COM object. A 30-second google session convinces me that it
should.
So if your calculation was encapsulated in a python object that looks
something like this:
class StrangeDivision():
def doDivision(x, y):
#Do your strange set of manipulations
return z
Generate a Clsid for your com module:
>>> import pythoncom
>>> print pythoncom.CreateGuid()
{7CC9F362-486D-11D1-BB48-0000E838A65F} <== do not use this one, make
your own!
Create a new python module that looks like this (you can do it in the
same file, but I think separating it is cleaner):
from StrangeDivision import StrangeDivision
class COMStrangeDivision(StrangeDivision):
_public_methods_ = ['doDivision']
_public_attrs_ = []
#Like I said, create your own clsid for the following line
_reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
_reg_desc_ = "Do my calculation in python"
_reg_progid_ = "StrangeDivision"
def __init__(self):
StrangeDivision.__init__(self)
#register is a module-level function
def register():
import win32com.server.register
win32com.server.register.UseCommandLine(COMStrangeDivision)
if __name__ == "__main__":
register()
Now run the above module from the command line:
c:\somepath> python COMStrangeDivision.py
That was fun, now for the VB part (apologies if this does not work in
VB4):
Global pySD as Object
Set pySD = CreateObject("StrangeDivision")
z = pySD.doDivision(x,y)
See also:
http://www.python.org/windows/win32com/QuickStartServerCom.html
I've been meaning to write this up for some time, perhaps in the ChiPy
wiki?
Robert
On Fri, 2006-03-31 at 20:37 -0800, Mr X wrote:
>
>
> Hi looking for help with what should be a fairly simple Python
> problem, relating to VB inter-operability.
> Got a great response from a fellow named Matt at help at python.org,
> pointed me in some good directions - some areas, concerns still foggy
> on, the below thread is included.... any feedback on this simple
> dilemma
> would be very appreciated.
>
> Thanks,
>
> D
>
> thread follows below;
>
> ------------------------------------
>
> To: help at python.org
> Subject: Problem with Python math functions and VB
> Date: 3/30/2006 9:39:28 PM
> Download Message Display Headers Printer Friendly
> Previous | Next
>
> Wondering if you might either know how to solve the following.
>
> I've a background in Visual Basic, and am using an old version, 4.0,
> it compiles to a smaller executable which I prefer. I find myself in
> an odd situation, needing a very simple yet powerful capability of
> Python for a VB app
> Im working on.
>
> Simply, a large 300 digit number is divided by a smaller number
> ranging from 1 to 3 digits. I.e;
>
> This large 300 digit number is generated as a string from the VB app,
> and I want to input this somehow
> from the VB app directly to Python for simple math operations.
>
> Where; x = 300 digit number, y = divisor ( say '37')
>
>
> x / 37
>
> I want to divide x by y but I want the remainder of this division to
> at least 3 or 4 decimal places, so my Python script at the command
> line;
>
> x %y /y. = z
>
> So now I want to take the resultant, the full number plus its
> remainder, and I want to round this number up
> to the next highest number and divide it by the same constant;
>
> z rounded up to next highest number (never the lowest)
>
> so
>
> z /y = z Long
>
> Remove the 'L' at the end, round up the last digit of z = Z
>
> Then;
>
> Z %y /y. = a
>
> Then I want the last five digits of z (not Z) and a truncated at the
> end, so the last digit before
> the decimal point and the four digits past the decimal point printed
> to a text file.
>
> I want to be able to open the text file with the VB app and use this
> data as inputs.
> ==========
>
> Ok, so here is my dilemma, I know VERY litle about Python and a fair
> bit about VB.
>
> Ideally, I'd love to be able to simply have some extremely small
> executable that just accepts inputs
> does the calculations above and then spits out the outputs. If it were
> possible to write some
> simple lines of math code in Python and then compile these scripts in
> Python to a Windows
> compatible executable,that would be fantastic.
>
> If I could simply have my VB app, 'call' the name of the tiny Python
> executable, and then the Python executable
> just automatically looked for a named text file (created by the VB
> app) and extracted the 300 digit number from this, then performed the
> calcs, then spit this data out as a new text file name it created,
> which I could then use the VB app to open and read from, THAT would be
> ideal.
>
> However, I don't know if Python can compile scripts to an exe? If it
> can how could I find out how to do this?
>
> If it doesn't, how could I get VB to directly pass commands to the
> Python command line and then automatically
> extract the outputs? Shelling out from VB to Python would be tough to
> the command line I think, since the Python command line uses the
> 'Edit / Mark, Paste' approach to inserting, copy inputs, outputs and
> this would be virtually untenable, as far as I can tell to automate in
> a VB shell out routine.
>
> So basically, how the heck can I access Pythons ability to perform
> simple calculations on very large numbers, easily, from within VB
> 4.0 ? There must be a way, it seems like such a simple think to do,
> especially since the actual math operations are so simple, straight
> forward, and would never change.....
>
> Any ideas?
>
>
>
> ------
> Matthew, thanks for your response.
>
> <-----Original Message----->
> >From: Matthew Dixon Cowles
> >Sent: 3/31/2006 9:41:18 AM
> >To: durango at mail2world.com
> >Cc: help at python.org
> >Subject: Re: [Python-Help] Problem with Python math functions and VB
>
> >I'm sure that there's a way to do that, but I'm not familiar with
> >Visual Basic and I don't know what inter-process communication
> >facilities it offers.
>
> Is there a person or group you might direct me to that has worked with
> this
> inter-process communication between VB and Python?
>
> >I don't think that Python is going to be able to do that for you out
> >of the box. Hundreds of digits of floating-point precision is a lot.
>
> Could you explain that a bit more, sorry Im not sure what you mean
> by 'out of the box' ? If I run the Python command line screen in
> windows
> and manually type out a very large number, say 180 digits; where 'X' =
> very large number;
>
> X %37 /37.
>
> returns what Im after, value wise..... but of course I don't want to
> do this manually each time
> for every dividend.
>
> >You might find that one of the Python modules that let you use an
> >extended-precision library would do what you want. GMPY is one:
>
> >http://gmpy.sourceforge.net/
>
> Hey, thats interesting, wonder if these modules can be operated on
> with VB.....
>
> >> So now I want to take the resultant, the full number plus its
> >> remainder, and I want to round this number up
> >> to the next highest number and divide it by the same constant;
> >
> >That's easy enough.
> >
> >> I want to be able to open the text file with the VB app and use
> this
> >> data as inputs.
> >
> >Python can write to a file without any trouble, so it that form of
> >inter-process communication suits you, you shouldn't have much
> >trouble. I assume that Visual Basic has an easy way to start a
> >program and supply it with arguments, so you could have your Python
> >program get its inputs from sys.argv.
>
> What is sys.argv ? Thats really good news. In fact, all I really need
> for the moment is
> a python executable that;
>
> ================
> PYTHON ALGORITHM ABSTRACT
>
> a) opens a text file
> b) reads a string from the file, which is a very large number
> c) performs simple arithmetic operations;
>
> X %37 /37. = y (four digit remainder after decimal point)
> X /37 = w (quotient as long, the resulting output is stored as a
> variable, the 'L' suffix tagged on the end of this resultant then gets
> removed.
> then the last digit in the quotient resultant string is increased in
> value by one, rounded upwards = 'Z'
>
> then
>
> Z %37 /37. = a
>
> then, y and a are printed to a text file with hard returns between
> them. Thats it, thats all I need to do.
> ===================
> >Alas, it's not going to be extremely small. There isn't a compiler
> >from Python to machine code. Py2exe will bundle a Python program,
> >with everything that it needs to run, into a single executable
> >archive. But the archive isn't small. Py2exe is at:
> >
> >http://www.py2exe.org/
>
> the most important thing is the functionality, I'll sacrifice size if
> I have to. My guess is this should work based on your comments,
> because
> perhaps all I really have to do is have VB dump out the value of the
> Very large number, `180 to 300 digits or so', to a text file, which
> then
> becomes the input data for the Python executable, and then if I simply
> call the name of the Python executable from VB as an instance,
> then the Python App runs, spits out the data as a new text file, then
> the VB app goes and opens the new text file and reads in the values,
> and voila! There it is. I'm pretty sure I can call the Python app from
> VB....... the alternative to all this would be to try and feed Python
> scripts
> directly to Python from VB, which I have NO idea how to do or where to
> begin.... and am guessing would be much more messy...
>
> I haven't programmed in Python, how would the "PYTHON ALGORITHM
> ABSTRACT" I describe above look like, code wise?
> Is this fairly easy for you to describe?
>
> >It may be that Python isn't the best solution for you here. Are
> there
> >extended-precision libraries for Visual Basic?
>
> Alas, none that I know of that are reliable and not incredibly
> expensive, been looking for years, plus Im hooped because I have to
> work
> with VB 4.0 instead of 6 +, guh....
>
> >Regards,
> >Matt
>
> Matt..... good name, why do I always seem to get along with Matts, you
> people keep popping up in my life and its always a blast!
>
> Best regards,
>
> D
>
> _______________________________________________________________
> Get the FREE email that has everyone talking at
> http://www.mail2world.com
> Unlimited Email Storage – POP3 – Calendar – SMS – Translator – Much
> More!
>
> _______________________________________________
> Chicago mailing list
> Chicago at python.org
> http://mail.python.org/mailman/listinfo/chicago
More information about the Chicago
mailing list