在py2exe构建中包含PYDs/DLLs
我有一个应用程序的模块,它使用了一个.pyd文件里的函数。虽然有一个选项可以排除dll文件(exclude_dlls),但有没有办法可以把它们包含进去呢?在构建过程中,似乎没有把我的模块中的.pyd文件复制过去,尽管其他的文件(.py)都被复制了。我还需要包含一个.dll文件。请问我该怎么做才能让py2exe同时包含.pyd和.dll文件呢?
4 个回答
2
你可以修改这个设置脚本,让它明确地复制文件:
script = "PyInvaders.py" #name of starting .PY
project_name = os.path.splitext(os.path.split(script)[1])[0]
setup(name=project_name, scripts=[script]) #this installs the program
#also need to hand copy the extra files here
def installfile(name):
dst = os.path.join('dist', project_name)
print 'copying', name, '->', dst
if os.path.isdir(name):
dst = os.path.join(dst, name)
if os.path.isdir(dst):
shutil.rmtree(dst)
shutil.copytree(name, dst)
elif os.path.isfile(name):
shutil.copy(name, dst)
else:
print 'Warning, %s not found' % name
pygamedir = os.path.split(pygame.base.__file__)[0]
installfile(os.path.join(pygamedir, pygame.font.get_default_font()))
installfile(os.path.join(pygamedir, 'pygame_icon.bmp'))
for data in extra_data:
installfile(data)
等等……当然,你可以根据自己的需要进行调整。
2
也许你可以在setup()中使用data_files选项:
import glob
setup(name='MyApp',
# other options,
data_files=[('.', glob.glob('*.dll')),
('.', glob.glob('*.pyd'))],
)
data_files应该是一个包含元组的列表,每个元组里有:
- 目标目录。
- 要复制的文件列表。
这样做不会把文件放进library.zip里,这对dll文件来说应该没问题,但我不太清楚pyd文件的情况。
12
.pyd文件和.DLL文件在这里是不同的,.pyd文件应该可以被模块查找器自动找到,只要你有正确的“import”语句,就不需要额外操作。如果有一个没有被找到,你就像漏掉了一个.py文件一样处理(它们都是模块):使用py2exe选项中的“include”选项。
模块查找器不一定能找到.DLL文件的依赖关系(py2exe可以检测到一些),所以你可能需要明确地包含这些文件,使用“data_files”选项。
举个例子,如果你需要包含两个.DLL文件('foo.dll'和'bar.dll'),还有三个.pyd文件('module1.pyd'、'module2.pyd'和'module3.pyd'):
setup(name='App',
# other options,
data_files=[('.', 'foo.dll'), ('.', 'bar.dll')],
options = {"py2exe" : {"includes" : "module1,module2,module3"}}
)