setuptools 包上的 Pyinstaller
Pyinstaller on a setuptools package
我正在尝试 运行 我在 Python 中使用 Click library. I'm having trouble building the project using PyInstaller. PyInstaller has a document in their GitHub wiki titled Recipe Setuptools Entry Point 构建的 CLI 应用程序上的 PyInstaller,它提供了有关如何将 PyInstaller 与 [=15] 一起使用的信息=] 包,我正在用于这个项目。但是,当我 运行 pyinstaller --onefile main.spec
.
时似乎找不到基本模块
我的问题是:问题是否仅仅是我的文件夹结构的问题? Recipe Setuptools Entry Point 是否采用特定的文件结构?
相关信息
Pyinstaller 输出
184 INFO: PyInstaller: 3.3.1
184 INFO: Python: 3.6.4
189 INFO: Platform: Darwin-16.7.0-x86_64-i386-64bit
193 INFO: UPX is available.
Traceback (most recent call last):
File "/usr/local/bin/pyinstaller", line 11, in <module>
sys.exit(run())
File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 94, in run
run_build(pyi_config, spec_file, **vars(args))
File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 46, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "/usr/local/lib/python3.6/site-packages/PyInstaller/building/build_main.py", line 791, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
File "/usr/local/lib/python3.6/site-packages/PyInstaller/building/build_main.py", line 737, in build
exec(text, spec_namespace)
File "<string>", line 40, in <module>
File "<string>", line 26, in Entrypoint
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 582, in get_entry_info
return get_distribution(dist).get_entry_info(group, name)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 564, in get_distribution
dist = get_provider(dist)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 436, in get_provider
return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 984, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 870, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'myapp' distribution was not found and is required by the application
main.py
的 main.spec
文件,这是我的 CLI 应用程序的入口点:
block_cipher = None
def Entrypoint(dist, group, name,
scripts=None, pathex=None, hiddenimports=None,
hookspath=None, excludes=None, runtime_hooks=None):
import pkg_resources
# get toplevel packages of distribution from metadata
def get_toplevel(dist):
distribution = pkg_resources.get_distribution(dist)
if distribution.has_metadata('top_level.txt'):
return list(distribution.get_metadata('top_level.txt').split())
else:
return []
hiddenimports = hiddenimports or []
packages = []
for distribution in hiddenimports:
packages += get_toplevel(distribution)
scripts = scripts or []
pathex = pathex or []
# get the entry point
ep = pkg_resources.get_entry_info(dist, group, name)
# insert path of the egg at the verify front of the search path
pathex = [ep.dist.location] + pathex
# script name must not be a valid module name to avoid name clashes on import
script_path = os.path.join(workpath, name + '-script.py')
print ("creating script for entry point", dist, group, name)
with open(script_path, 'w') as fh:
print("import", ep.module_name, file=fh)
print("%s.%s()" % (ep.module_name, '.'.join(ep.attrs)), file=fh)
for package in packages:
print ("import", package, file=fh)
return Analysis([script_path] + scripts, pathex, hiddenimports, hookspath, excludes, runtime_hooks)
a = Entrypoint('myapp', 'console_scripts', 'myapp')
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')
我在虚拟环境中运行pip3 install --editable .
时生成的myapp
脚本内容:
#!/some/path/to/myapp-cli/venv/bin/python3.6
# EASY-INSTALL-ENTRY-SCRIPT: 'myapp','console_scripts','myapp'
__requires__ = 'myapp'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('myapp', 'console_scripts', 'myapp')()
)
最后,我的存储库结构:
myapp-cli/
├── README.md
├── myapp
│ ├── __init__.py
│ ├── main.py
│ ├── main.spec
│ ├── resources
│ │ ├── __init__.py
│ │ └── functions.py
│ ├── subcommands
│ │ ├── __init__.py
│ │ ├── config
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ ├── create
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ ├── destroy
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ └── switch
│ │ ├── __init__.py
│ │ └── cli.py
│ └── variables.py
├── requirements.txt
└── setup.py
还有我的 setup.py
文件:
from setuptools import find_packages
from setuptools import setup
import os
base_dir = os.path.dirname(__file__)
setup(
entry_points = '''
[console_scripts]
myapp=myapp.main:entry_point
''',
install_requires = [
'packageone==1.0',
'packagetwo==2.0',
],
name = "myapp",
packages=find_packages(),
setup_requires="setuptools",
version = "0.1",
)
这个错误:
pkg_resources.DistributionNotFound: The 'myapp' distribution was not found and is required by the application
表示此包不在PYTHONPATH
上。我将它固定在 Windows 上:
set PYTHONPATH=.
根据您的 OS 选择进行调整。
除了路径问题,还有:
在setup.py中:
setup(
entry_points = '''
[console_scripts]
myapp=myapp.main:entry_point
''',
在main.spec中:
a = Entrypoint('myapp', 'console_scripts', 'myapp')
根据 setup.py,您的入口点似乎是 myapp.main
而不是 myapp
。所以你可能需要:
a = Entrypoint('myapp', 'console_scripts', 'myapp.main')
首先: 我结合使用了 Stephen 的答案,以及我自己的一些挖掘来找到答案。最后,Stephen 的第一部分成功了:手动添加/导出 PYTHONPATH
变量。您实际上可以在 Entrypoint
函数中使用 pathex
指定它,如下所示:
a = Entrypoint('myapp-cli',
'console_scripts',
'myapp',
pathex=['/some/path/to/myapp-cli/myapp', '/some/path/to/myapp-cli']
)
毕竟我不需要 myapp.main
。
其次: 我在 PyInstaller not 生成单个二进制文件时仍然遇到问题。对我来说,这成功了:
- 将 最新 版本的 PyInstaller 添加到您的
requirements.txt
或 setup.py
中的 install_requires
:https://github.com/pyinstaller/pyinstaller/archive/develop.zip。
- 此外,您可以使用
pyi-makespec
中的 --onefile
选项创建 .spec
文件,如下所示:pyi-makespec --onefile myapp.py
。这将生成一个 .spec
文件,确保您的所有包都被编译成二进制文件。
最后,下面的规范文件成功了,我能够制作一个完全可用的二进制文件:
# -*- mode: python -*-
block_cipher = None
def Entrypoint(dist, group, name,
scripts=None, pathex=None, hiddenimports=None,
hookspath=None, excludes=None, runtime_hooks=None):
import pkg_resources
# get toplevel packages of distribution from metadata
def get_toplevel(dist):
distribution = pkg_resources.get_distribution(dist)
if distribution.has_metadata('top_level.txt'):
return list(distribution.get_metadata('top_level.txt').split())
else:
return []
hiddenimports = hiddenimports or []
packages = []
for distribution in hiddenimports:
packages += get_toplevel(distribution)
scripts = scripts or []
pathex = pathex or []
# get the entry point
ep = pkg_resources.get_entry_info(dist, group, name)
# insert path of the egg at the verify front of the search path
pathex = [ep.dist.location] + pathex
# script name must not be a valid module name to avoid name clashes on import
script_path = os.path.join(workpath, name + '-script.py')
print ("creating script for entry point", dist, group, name)
with open(script_path, 'w') as fh:
print("import", ep.module_name, file=fh)
print("%s.%s()" % (ep.module_name, '.'.join(ep.attrs)), file=fh)
for package in packages:
print ("import", package, file=fh)
return Analysis([script_path] + scripts, pathex, hiddenimports, hookspath, excludes, runtime_hooks)
a = Entrypoint('myapp-cli',
'console_scripts',
'myapp',
pathex=['/some/path/to/myapp-cli/myapp', '/some/path/to/myapp-cli']
)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='myapp',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
我认为最终使用 Cobra for Golang 这样的东西会更容易,因为 Golang 编译 one-file 二进制文件开箱即用。但是,如果您更喜欢 Python,这应该可以解决问题。
我注意到 typical way of adding a data file doesn't work once you've monkey patched Entrypoint in the way Scott Crooks recommends in the 。对我来说,我必须附加到 a.datas
数组。在 python3 中,这看起来像:
...
a = Entrypoint(...)
from pathlib import Path
Path('/tmp/modulename/datafile.txt').write_text(Path('datafile.txt').read_text()))
a.datas.append('datafile.txt', '/tmp/modulename/datafile.txt', 'DATA')
pyz = PYZ(...)
...
已接受的答案对我不起作用。我必须通过 .spec
文件添加 egg-info
目录。
我对 Entrypoint
函数的调用如下所示:
a = Entrypoint(
'PrintIt',
'console_scripts',
'printit',
datas=[('plugins/*.egg', 'plugins/'),
('../PrintIt.egg-info/*', 'PrintIt.egg-info/')])
经过多次搜索,这个错误通常是由于试图访问项目包的元数据(即版本是主要的)。
包元数据通常使用 pkg_resources
或较旧的 distutil
访问,或者显式访问,或者通常隐藏在其他包中(通常尝试访问包版本)。从 Python v3.8 开始,它也将在 importlib.metadata
.
的标准库中可用
如果是这种情况,您可能需要将部分或全部文件包含在 mypackage.egg-info
文件夹中,尤其是文件 PKG_INFO
,但可能需要所有文件。
有多种方法可以做到这一点,以下是我喜欢的几种方法:
1。如果您使用的是 script.spec
文件,您可以根据 Charles 的回答更新 datas=
行以包含此信息:
a = Analysis(['myscript.py'],
pathex=['C:\path\to\mypackage'],
binaries=[],
datas=[('mypackage.egg-info/*','mypackage.egg-info')],
2。创建一个自定义hooks文件,放在一个目录下,在命令行添加该目录为自定义hooks目录
创建一个 hook-mypackage.py
挂钩文件,包含以下非常简单且非常优雅的行:
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata('md2mat')
我将其放入根 package/repo 文件夹中的新 hooks
文件夹中,然后将以下内容添加到我的 pyinstaller 命令中:
pyinstaller -F -y --additional-hooks-dir=hooks myscript.py
它工作得很好,假设 copy_metadata
功能在我们从旧的元数据包切换到新的 importlib.metadata 时得到很好的维护,它应该会在未来 Python 中正常工作更新。
3。直接在命令行添加额外的数据文件
这可能是我最喜欢的,如果我能让它工作的话...
pyinstaller --add-data <SRC;DEST> myscript.py
此选项 --add-data
出现在帮助输出 (pyinstaller --help
) 中,并指示参数格式应为 SRC;DEST for Windows,因此我 认为 它必须与其他方法的 datas=
格式相匹配,但我无法让它工作。
我认为最接近正确的格式如下:
pyinstaller -F -y --add-data "mypackage.egg-info/*;mypackage.egg-info"
pyinstaller -F -y --add-data="mypackage.egg-info/*;mypackage.egg-info"
这些可以编译,但生成的 exe 将 运行 没有输出。
PyInstaller Documentation 中缺少 --add-data
选项,但在 运行 宁 pyinstaller --help-commands
时显示。
我正在尝试 运行 我在 Python 中使用 Click library. I'm having trouble building the project using PyInstaller. PyInstaller has a document in their GitHub wiki titled Recipe Setuptools Entry Point 构建的 CLI 应用程序上的 PyInstaller,它提供了有关如何将 PyInstaller 与 [=15] 一起使用的信息=] 包,我正在用于这个项目。但是,当我 运行 pyinstaller --onefile main.spec
.
我的问题是:问题是否仅仅是我的文件夹结构的问题? Recipe Setuptools Entry Point 是否采用特定的文件结构?
相关信息
Pyinstaller 输出
184 INFO: PyInstaller: 3.3.1
184 INFO: Python: 3.6.4
189 INFO: Platform: Darwin-16.7.0-x86_64-i386-64bit
193 INFO: UPX is available.
Traceback (most recent call last):
File "/usr/local/bin/pyinstaller", line 11, in <module>
sys.exit(run())
File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 94, in run
run_build(pyi_config, spec_file, **vars(args))
File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 46, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "/usr/local/lib/python3.6/site-packages/PyInstaller/building/build_main.py", line 791, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
File "/usr/local/lib/python3.6/site-packages/PyInstaller/building/build_main.py", line 737, in build
exec(text, spec_namespace)
File "<string>", line 40, in <module>
File "<string>", line 26, in Entrypoint
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 582, in get_entry_info
return get_distribution(dist).get_entry_info(group, name)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 564, in get_distribution
dist = get_provider(dist)
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 436, in get_provider
return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 984, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 870, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'myapp' distribution was not found and is required by the application
main.py
的 main.spec
文件,这是我的 CLI 应用程序的入口点:
block_cipher = None
def Entrypoint(dist, group, name,
scripts=None, pathex=None, hiddenimports=None,
hookspath=None, excludes=None, runtime_hooks=None):
import pkg_resources
# get toplevel packages of distribution from metadata
def get_toplevel(dist):
distribution = pkg_resources.get_distribution(dist)
if distribution.has_metadata('top_level.txt'):
return list(distribution.get_metadata('top_level.txt').split())
else:
return []
hiddenimports = hiddenimports or []
packages = []
for distribution in hiddenimports:
packages += get_toplevel(distribution)
scripts = scripts or []
pathex = pathex or []
# get the entry point
ep = pkg_resources.get_entry_info(dist, group, name)
# insert path of the egg at the verify front of the search path
pathex = [ep.dist.location] + pathex
# script name must not be a valid module name to avoid name clashes on import
script_path = os.path.join(workpath, name + '-script.py')
print ("creating script for entry point", dist, group, name)
with open(script_path, 'w') as fh:
print("import", ep.module_name, file=fh)
print("%s.%s()" % (ep.module_name, '.'.join(ep.attrs)), file=fh)
for package in packages:
print ("import", package, file=fh)
return Analysis([script_path] + scripts, pathex, hiddenimports, hookspath, excludes, runtime_hooks)
a = Entrypoint('myapp', 'console_scripts', 'myapp')
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')
我在虚拟环境中运行pip3 install --editable .
时生成的myapp
脚本内容:
#!/some/path/to/myapp-cli/venv/bin/python3.6
# EASY-INSTALL-ENTRY-SCRIPT: 'myapp','console_scripts','myapp'
__requires__ = 'myapp'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('myapp', 'console_scripts', 'myapp')()
)
最后,我的存储库结构:
myapp-cli/
├── README.md
├── myapp
│ ├── __init__.py
│ ├── main.py
│ ├── main.spec
│ ├── resources
│ │ ├── __init__.py
│ │ └── functions.py
│ ├── subcommands
│ │ ├── __init__.py
│ │ ├── config
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ ├── create
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ ├── destroy
│ │ │ ├── __init__.py
│ │ │ └── cli.py
│ │ └── switch
│ │ ├── __init__.py
│ │ └── cli.py
│ └── variables.py
├── requirements.txt
└── setup.py
还有我的 setup.py
文件:
from setuptools import find_packages
from setuptools import setup
import os
base_dir = os.path.dirname(__file__)
setup(
entry_points = '''
[console_scripts]
myapp=myapp.main:entry_point
''',
install_requires = [
'packageone==1.0',
'packagetwo==2.0',
],
name = "myapp",
packages=find_packages(),
setup_requires="setuptools",
version = "0.1",
)
这个错误:
pkg_resources.DistributionNotFound: The 'myapp' distribution was not found and is required by the application
表示此包不在PYTHONPATH
上。我将它固定在 Windows 上:
set PYTHONPATH=.
根据您的 OS 选择进行调整。
除了路径问题,还有:
在setup.py中:
setup(
entry_points = '''
[console_scripts]
myapp=myapp.main:entry_point
''',
在main.spec中:
a = Entrypoint('myapp', 'console_scripts', 'myapp')
根据 setup.py,您的入口点似乎是 myapp.main
而不是 myapp
。所以你可能需要:
a = Entrypoint('myapp', 'console_scripts', 'myapp.main')
首先: 我结合使用了 Stephen 的答案,以及我自己的一些挖掘来找到答案。最后,Stephen 的第一部分成功了:手动添加/导出 PYTHONPATH
变量。您实际上可以在 Entrypoint
函数中使用 pathex
指定它,如下所示:
a = Entrypoint('myapp-cli',
'console_scripts',
'myapp',
pathex=['/some/path/to/myapp-cli/myapp', '/some/path/to/myapp-cli']
)
毕竟我不需要 myapp.main
。
其次: 我在 PyInstaller not 生成单个二进制文件时仍然遇到问题。对我来说,这成功了:
- 将 最新 版本的 PyInstaller 添加到您的
requirements.txt
或setup.py
中的install_requires
:https://github.com/pyinstaller/pyinstaller/archive/develop.zip。 - 此外,您可以使用
pyi-makespec
中的--onefile
选项创建.spec
文件,如下所示:pyi-makespec --onefile myapp.py
。这将生成一个.spec
文件,确保您的所有包都被编译成二进制文件。
最后,下面的规范文件成功了,我能够制作一个完全可用的二进制文件:
# -*- mode: python -*-
block_cipher = None
def Entrypoint(dist, group, name,
scripts=None, pathex=None, hiddenimports=None,
hookspath=None, excludes=None, runtime_hooks=None):
import pkg_resources
# get toplevel packages of distribution from metadata
def get_toplevel(dist):
distribution = pkg_resources.get_distribution(dist)
if distribution.has_metadata('top_level.txt'):
return list(distribution.get_metadata('top_level.txt').split())
else:
return []
hiddenimports = hiddenimports or []
packages = []
for distribution in hiddenimports:
packages += get_toplevel(distribution)
scripts = scripts or []
pathex = pathex or []
# get the entry point
ep = pkg_resources.get_entry_info(dist, group, name)
# insert path of the egg at the verify front of the search path
pathex = [ep.dist.location] + pathex
# script name must not be a valid module name to avoid name clashes on import
script_path = os.path.join(workpath, name + '-script.py')
print ("creating script for entry point", dist, group, name)
with open(script_path, 'w') as fh:
print("import", ep.module_name, file=fh)
print("%s.%s()" % (ep.module_name, '.'.join(ep.attrs)), file=fh)
for package in packages:
print ("import", package, file=fh)
return Analysis([script_path] + scripts, pathex, hiddenimports, hookspath, excludes, runtime_hooks)
a = Entrypoint('myapp-cli',
'console_scripts',
'myapp',
pathex=['/some/path/to/myapp-cli/myapp', '/some/path/to/myapp-cli']
)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='myapp',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
我认为最终使用 Cobra for Golang 这样的东西会更容易,因为 Golang 编译 one-file 二进制文件开箱即用。但是,如果您更喜欢 Python,这应该可以解决问题。
我注意到 typical way of adding a data file doesn't work once you've monkey patched Entrypoint in the way Scott Crooks recommends in the a.datas
数组。在 python3 中,这看起来像:
...
a = Entrypoint(...)
from pathlib import Path
Path('/tmp/modulename/datafile.txt').write_text(Path('datafile.txt').read_text()))
a.datas.append('datafile.txt', '/tmp/modulename/datafile.txt', 'DATA')
pyz = PYZ(...)
...
已接受的答案对我不起作用。我必须通过 .spec
文件添加 egg-info
目录。
我对 Entrypoint
函数的调用如下所示:
a = Entrypoint(
'PrintIt',
'console_scripts',
'printit',
datas=[('plugins/*.egg', 'plugins/'),
('../PrintIt.egg-info/*', 'PrintIt.egg-info/')])
经过多次搜索,这个错误通常是由于试图访问项目包的元数据(即版本是主要的)。
包元数据通常使用 pkg_resources
或较旧的 distutil
访问,或者显式访问,或者通常隐藏在其他包中(通常尝试访问包版本)。从 Python v3.8 开始,它也将在 importlib.metadata
.
如果是这种情况,您可能需要将部分或全部文件包含在 mypackage.egg-info
文件夹中,尤其是文件 PKG_INFO
,但可能需要所有文件。
有多种方法可以做到这一点,以下是我喜欢的几种方法:
1。如果您使用的是 script.spec
文件,您可以根据 Charles 的回答更新 datas=
行以包含此信息:
a = Analysis(['myscript.py'],
pathex=['C:\path\to\mypackage'],
binaries=[],
datas=[('mypackage.egg-info/*','mypackage.egg-info')],
2。创建一个自定义hooks文件,放在一个目录下,在命令行添加该目录为自定义hooks目录
创建一个 hook-mypackage.py
挂钩文件,包含以下非常简单且非常优雅的行:
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata('md2mat')
我将其放入根 package/repo 文件夹中的新 hooks
文件夹中,然后将以下内容添加到我的 pyinstaller 命令中:
pyinstaller -F -y --additional-hooks-dir=hooks myscript.py
它工作得很好,假设 copy_metadata
功能在我们从旧的元数据包切换到新的 importlib.metadata 时得到很好的维护,它应该会在未来 Python 中正常工作更新。
3。直接在命令行添加额外的数据文件
这可能是我最喜欢的,如果我能让它工作的话...
pyinstaller --add-data <SRC;DEST> myscript.py
此选项 --add-data
出现在帮助输出 (pyinstaller --help
) 中,并指示参数格式应为 SRC;DEST for Windows,因此我 认为 它必须与其他方法的 datas=
格式相匹配,但我无法让它工作。
我认为最接近正确的格式如下:
pyinstaller -F -y --add-data "mypackage.egg-info/*;mypackage.egg-info"
pyinstaller -F -y --add-data="mypackage.egg-info/*;mypackage.egg-info"
这些可以编译,但生成的 exe 将 运行 没有输出。
PyInstaller Documentation 中缺少 --add-data
选项,但在 运行 宁 pyinstaller --help-commands
时显示。