使用py2exe构建带扩展的Python程序

2 投票
2 回答
2126 浏览
提问于 2025-04-15 16:41

我在找 py2exe 的使用方法时遇到了困难,特别是那些需要 C 扩展的情况。

下面这个方法在没有 "ext_modules" 的情况下运行得很好。但是加上它后,我就遇到了 "NameError: name 'Extension' is not defined" 的错误。

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>

任何帮助都会非常感谢。

2 个回答

0

试着把

from distutils.core import setup

改成

from distutils.core import setup, Extension
1

在我修复了因为忘记导入Extension而产生的小错误后,我又遇到了其他错误,提示我关于-lsqlite3这个标志有问题。结果我发现需要按照这里的步骤来操作:http://cboard.cprogramming.com/cplusplus-programming/82135-sqlite-questions.html

  1. 从sqlite.org/download.html下载sqlitedll-3_3_7.zip和sqlite-source-3_3_7.zip。
  2. 解压sqlitedll-3.3.7.zip,然后在命令行中运行:

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

  3. 把刚刚创建的libsqlite3dll.a放到MinGW的lib目录里。
  4. 把sqlite3.dll放到你的系统路径中(我用的是c:\Windows\System32\)。
  5. 解压sqlite-source-3_3_7.zip,把sqlite3.h放到你的MinGW的include目录里。
  6. 在链接的时候,你需要提供这个参数:-lsqlite3dll(这意味着要把libraries=['sqlite3']改成libraries=['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'])]
)

撰写回答