создать программу Python с расширениями, используя py2exe

StackOverflow https://stackoverflow.com/questions/1848275

  •  13-09-2019
  •  | 
  •  

Вопрос

Мне трудно найти рецепты py2exe, особенно для случаев, когда требуются расширения c.

Следующий рецепт отлично работает без части «ext_modules».При этом я получаю «NameError:имя «Расширение» не определено.

from distutils.core import setup
import py2exe
import matplotlib
import os

s = os.popen('svnversion')
version = s.read()
f = open('cpa_version.py', 'w')
f.write('VERSION = "%s"\n'%(version.strip()))
f.close()

setup(console=['cpa.py'],
      options={
        'py2exe': {
            'packages' : ['matplotlib', 'pytz', 'MySQLdb', 'pysqlite2'],
            'includes' : ['PILfix', 'version'],
            "excludes" : ['_gtkagg', '_tkagg',
                          "Tkconstants","Tkinter","tcl"],
            "dll_excludes": ['libgdk-win32-2.0-0.dll',
                             'libgobject-2.0-0.dll', 
                             'libgdk_pixbuf-2.0-0.dll',
                             'tcl84.dll', 'tk84.dll']
            }
        },
      data_files=matplotlib.get_py2exe_datafiles(),
      # how to build _classifier.c???
      ext_modules = [Extension('_classifier',
                               sources = ['_classifier.c'],
                               include_dirs=[numpy.get_include()],
                               libraries = ['sqlite3'])]
)

_classifier.c включает в себя следующее


#include "sqlite3.h"
#include "Python.h"
#include "numpy/arrayobject.h"
#include <stdio.h>

любая помощь будет принята с благодарностью.

Это было полезно?

Решение

После исправления небольшой ошибки, возникшей из-за того, что я забыл импортировать расширение, я столкнулся с другими ошибками, указывающими на проблему с флагом -lsqlite3.Оказывается, мне нужно было выполнить шаги, описанные здесь: http://cboard.cprogramming.com/cplusplus-programming/82135-sqlite-questions.html

  1. Загрузите sqlitedll-3_3_7.zip и sqlite-source-3_3_7.zip с сайта sqlite.org/download.html.
  2. Распакуйте sqlitedll-3.3.7.zip и запустите из командной строки:

    dlltool -D sqlite3.dll -d sqlite3.def -l libsqlite3dll.a

  3. Поместите libsqlite3dll.a (только что созданный) в каталог библиотеки MinGW.
  4. Поместите sqlite3.dll в свой системный путь (у меня работал c:\Windows\System32\)
  5. Извлеките sqlite-source-3_3_7.zip и поместите sqlite3.h в каталог включения MinGW.
  6. При ссылке вам нужно будет указать параметр:-lsqlite3dll (это означало изменение библиотеки=['sqlite3'] на библиотеки=['sqlite3dll'])

...После этого сборка заработала.

Вот еще раз установочный файл:

from distutils.core import setup, Extension
import py2exe
import matplotlib
import os
import numpy

setup(console=['cpa.py'],
      options={
        'py2exe': {
            'packages' : ['matplotlib', 'pytz', 'MySQLdb', 'pysqlite2'],
            'includes' : ['PILfix', 'version'],
            "excludes" : ['_gtkagg', '_tkagg',
                          "Tkconstants","Tkinter","tcl"],
            "dll_excludes": ['libgdk-win32-2.0-0.dll',
                             'libgobject-2.0-0.dll', 
                             'libgdk_pixbuf-2.0-0.dll',
                             'tcl84.dll', 'tk84.dll']
            }
        },
      data_files=matplotlib.get_py2exe_datafiles(),
      ext_modules = [Extension('_classifier',
                               sources = ['_classifier.c'],
                               include_dirs=[numpy.get_include()],
                               libraries = ['sqlite3dll'])]
)

Другие советы

Попробуйте изменить

from distutils.core import setup

к

from distutils.core import setup, Extension
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top