如何使用pyinstaller在可执行文件中包含.dll文件?

时间:2016-08-05 14:28:17

标签: python numpy dll pyinstaller

我想从我的python脚本生成一个可执行文件。 为此,我使用pyinstaller。我遇到了mkl库的问题,因为我在脚本中使用了numpy。

我使用了这个hook所以解决了这个问题,它运行正常。但是如果我将单个可执行文件复制到另一个目录并执行它,它就不起作用。我想我也要复制钩子。但我只想拥有一个单独的文件,我可以在其他计算机上使用而无需复制.dll's或钩子。

我还按照here所述更改了.spec文件,并将必要的文件添加到binaries - 变量中。只要.dll's位于binaries - 变量的提供目录中,这也有效,但是当我在没有这些{{1}的计算机上使用可执行文件时,这不起作用}}

我尝试使用.dll's选项。这也解决了这个问题,但只是在某处提供--hidden-import= FILENAME时。

我正在寻找的是将.dll's捆绑到单个可执行文件中的可能性,以便我有一个独立工作的文件。

3 个答案:

答案 0 :(得分:5)

当我遇到这里描述的问题时 https://github.com/ContinuumIO/anaconda-issues/issues/443 我的解决方法是

$scope.$storage = $localStorage; $scope.InfoInter = $localStorage.InfoInter; $scope.newInfoInter = {}; $scope.addInfoInter=function(){ /* AD(added later): I added this line to test and initialize the variable and my issue disapeard */ if (typeof($scope.InfoInter) == 'undefined'){$scope.InfoInter=[]}; $scope.InfoInter.push($scope.newInfoInter); $scope.newInfoInter = {}; $scope.save(); }; $scope.remove = function(item) { var index = $scope.InfoInter.indexOf(item); $scope.InfoInter.splice(item, 1); }; $scope.save = function() { $localStorage.InfoInter = $scope.InfoInter; }; $scope.load = function() { $scope.InfoInter = $localStorage.InfoInter; }; });

pyinstaller -F --add-data vcruntime140.dll;. myscript.py - 收集到一个 * .exe 文件

-F - exe文件中dll的目标路径

来自docs http://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-data-files

答案 1 :(得分:1)

将当前项目文件夹添加到Path,然后使用以下命令创建EXE:

pyinstaller --add-binary AutoItX3_x64.dll;. program_name.py

在当前项目文件夹中创建文件夹\dist\program_name\autoit\lib,并将AutoItX3_x64.dll粘贴到其中。

答案 2 :(得分:0)

由于选择的答案在使用 libportaudio64bit.dll 的情况下不起作用,因此将有效的解决方案放在这里。

对我来说,可行的解决方案是在.exe文件所在的位置添加 _sounddevice_data 文件夹,然后在其中创建一个 portaudio-binaries 文件夹,最后将最新创建的文件夹中的libportaudio64bit.dll

希望有帮助!