开发者

pymssql throws ImportError: No module named _mssql when build app with py2exe

开发者 https://www.devze.com 2023-03-25 22:58 出处:网络
I have python application that shoud be launched as windows executable. I\'m using py2exe and pymssql 1.9.908.

I have python application that shoud be launched as windows executable. I'm using py2exe and pymssql 1.9.908.

I used next build script to generate application:

from distutils.core import setup
import MySQLdb
import fnmatch
import os
import pymssql
import shutil
import py2exe
import glob

##############

name = 'BGAgent'
old_version = '0.1'
ver = '0.1'

distDir = 'Dist' + name + ver
shutil.rmtree(distDir, True)
shutil.rmtree('Dist' + name + old_version, True)

os.mkdir(distDir)

##############

class Target(object):
    """ A simple class that holds information on our executable file. """
    def __init__(self, **kw):
        """ Default class constructor. Update as you need. """
        self.__dict__.update(kw)

# MySQLdb
#dst = os.path.join(distDir, "MySQLdb")
#copy_tree(MySQLdb.__path__[0], dst )
# pymssql
site_packages_dir = os.path.dirname(pymssql.__file__)
pymssql_files = []#'pymssql.py', 'pymssql.pyc', 'pymssql.pyo', '_mssql.pyd']
for eggInfo in glob.glob(os.path.join(site_packages_dir, '*mssql*')) :
    pymssql_files.append(os.path.basename(eggInfo))

for fname in pymssql_files :
    src = os.path.join(site_packages_dir, fname)
    dst = os.path.join(distDir, fname)
    if(os.path.isfile(src)) :
        shutil.copy(src, dst)
    else :
        shutil.copytree(src, dst)

includes = ['MySQLdb', 'pymssql', 'OpenSSL']
excludes = ['run_w.exe'] #['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', 'Tkconstants', 'Tkinter']

packages = ['MySQLdb', 'pymssql', 'OpenSSL']

dll_excludes = []#['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll']

data_files = ['server.pem', 
              'config.ini', 
              'run.bat',
              #os.path.join(os.path.split(pymssql.__file__)[0], 'ntwdblib.dll'),
              ]
icon_resources = []
bitmap_resources = []
other_resources = []


MyApp_Target = Target(
    # what to build
    script = "run.py",
    icon_resources = icon_resources,
    bitmap_resources = bitmap_resources,
    other_resources = other_resources,
    dest_base = name,    
    version = ver,
    company_name = "",
    copyright = "",
    name = name,
    )


setup(
    data_files = data_files,
    options = {"py2exe": {"compressed": 0, 
                          "optimize": 1,
                          "includes": includes,
                          "excludes": excludes,
                          "packages": packag开发者_如何转开发es,
                          "dll_excludes": dll_excludes,
                          "bundle_files": 3,
                          "dist_dir": distDir,
                          "xref": False,
                          "skip_archive": False,
                          "ascii": False,
                          "custom_boot_script": '',
                         }
              },
    zipfile = r'library.zip',
    console = [],
    windows = [MyApp_Target],
    service = [],
    com_server = [],
    ctypes_com_server = []
    )

Build works, but I have error when I tried to launch application:

  File "pymssql.pyo", line 12, in <module>
  File "pymssql.pyo", line 10, in __load
  File "_mssql.pxd", line 10, in init pymssql (pymssql.c:7370)
ImportError: No module named _mssql

_mssql.pyd and pymssql.pyd files are in executable directory.

OS version Windows 7 Enterprice SP 1.


In the program you are trying to import (eg. in the A.py for A.exe ), specify import statement for _mssql as well. You might also need to import a couple of other modules (decimal & uuid )to get the exe working


Just add the statement import _mssql in your file. Next, run your program. When you get the same thing, just import that module in your code. This method works well for me.


from distutils.core import setup

import py2exe, os, pymssql
import decimal

data_files = []
data_files.append(os.path.join(os.path.split(pymssql.__file__)[0], 'ntwdblib.dll'))
py2exe_options = {"py2exe":{"includes": ['decimal'],
                "dll_excludes":["mswsock.dll",
                "powrprof.dll",
                "user32.dll",
                "shell32.dll",
                "wsock32.dll",
                "advapi32.dll",
                "kernel32.dll",
                "ntwdblib.dll",
                "ws2_32.dll",
                "oleaut32.dll",
                "ole32.dll",
                            ],
}}

setup(console=["jobs_pcc_main.py"], options= py2exe_options, data_files=data_files)


To whom might help I got lots of issues trying to user pymssql with Pyinstaller and I finally got it right so posting here might help someone after you install pymssql using pip install pymssql

use this parameters in pyinstaller to get it included

--onefile --paths=.\venv\ --hidden-import='pymssql' --hidden-import='uuid' --collect-all='pymssql' --collect-all='uuid'
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号