pymssql выдает ImportError: нет модуля с именем _mssql при сборке приложения с помощью py2exe

У меня есть приложение Python, которое нужно запускать как исполняемый файл Windows. Я использую py2exe и pymssql 1.9.908.

Я использовал следующий скрипт сборки для создания приложения:

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": packages,
                          "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 = []
    )

Сборка работает, но у меня ошибка при запуске приложения:

  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 и pymssql.pyd находятся в исполняемом каталоге.

Версия ОС Windows 7 Enterprise SP 1.


person varela    schedule 04.08.2011    source источник


Ответы (3)


В программе, которую вы пытаетесь импортировать (например, в A.py для A.exe), также укажите оператор импорта для _mssql. Вам также может понадобиться импортировать пару других модулей (десятичный и uuid), чтобы заставить exe работать

person Pollo    schedule 18.10.2011
comment
Это была ошибка в pymssql. Если я неявно импортирую _mssql перед модулем сокета, все работает нормально. Я нашел, как это исправить, но все равно спасибо. - person varela; 19.10.2011

Просто добавьте оператор import _mssql в свой файл. Далее запустите вашу программу. Когда вы получите то же самое, просто импортируйте этот модуль в свой код. Этот метод хорошо работает для меня.

person cyl    schedule 23.04.2013

person    schedule
comment
привет, я публикую свой setup.py, я столкнулся с той же проблемой, пожалуйста, обратитесь к этому setup.py, я думаю, ваш код будет в порядке. - person Chris; 08.03.2012
comment
Спасибо за совет. Почему вы включаете ntwdblib.dll как файл данных и исключаете как DLL? В чем хитрость? Моя проблема была с модулем сокета. Похоже, что pymssql исправляет его обезьяной, и я импортировал его до pymssql. - person varela; 10.03.2012