尝试使用 PyInstaller 时出现权限错误
Permission Error When Trying to Use PyInstaller
尝试使用 PyInstaller 部署 Kivy 应用程序时,即使使用管理员 CMD,我也会收到权限被拒绝的错误。该文件夹为每个用户提供了所有打开的编辑选项。 Python 具有防火墙访问权限。如何解决这个问题?
PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "./"
422 INFO: PyInstaller: 3.3.1
422 INFO: Python: 3.6.5
424 INFO: Platform: Windows-10-10.0.17134-SP0
425 INFO: wrote C:\Users\theguy\Documents\Python\myapp-build\myapp.spec
426 INFO: UPX is not available.
427 INFO: Extending PYTHONPATH with paths
['C:\Users\theguy\Documents\Python',
'C:\Users\theguy\Documents\Python\myapp-build']
428 INFO: checking Analysis
428 INFO: Building Analysis because out00-Analysis.toc is non existent
429 INFO: Initializing module dependency graph...
432 INFO: Initializing module graph hooks...
434 INFO: Analyzing base_library.zip ...
3859 INFO: running Analysis out00-Analysis.toc
3861 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
required by C:\Anaconda3\python.exe
4398 INFO: Caching module hooks...
4402 INFO: Analyzing C:\Users\btdav\Documents\Python\
Traceback (most recent call last):
File "C:\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 101, in <module>
run()
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 94, in run
run_build(pyi_config, spec_file, **vars(args))
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 46, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 791, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 737, in build
exec(text, spec_namespace)
File "<string>", line 16, in <module>
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 213, in __init__
self.__postinit__()
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__
self.assemble()
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 415, in assemble
priority_scripts.append(self.graph.run_script(script))
File "C:\Anaconda3\lib\site-packages\PyInstaller\depend\analysis.py", line 201, in run_script
self._top_script_node = super(PyiModuleGraph, self).run_script(pathname)
File "C:\Anaconda3\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1334, in run_script
with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\Users\theguy\Documents\Python\myapp-build'
诀窍是在您正在构建的目录之外创建一个新目录,然后像下面的代码一样使构建引用 Kivy 应用程序的 main.py。这修复了权限错误,即使是来自常规 CMD。
PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "C:\Users\theguy\Documents\Python\myapp\main.py"
我 运行 遇到了同样的错误,发现当我在具有管理员权限的 PowerShell 中构建它时它起作用了。
报错信息显示“INFO: UPX is not available”,您需要导入UPX.exe,此问题将得到解决。
enter image description here
我遇到了同样的问题!
我发现是我的杀毒软件(Bitdefender)认为写出来的.exe是危险的,所以阻止了这个动作。
将我的工作文件夹添加到防病毒软件 Exclusions 后,然后重新启动计算机,就可以了。
更新:
您需要对您的 .exe 文件进行“代码签名”,以使防病毒软件认为它不那么危险。
在Windows中:
使用OpenSSL创建自签名,然后使用Win10 SDKsigntool.exe
OpenSSL 命令示例:
openssl genpkey -out privkey.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096
openssl req -new -x509 -key privkey.pem -out cert.pem -days 3650
openssl pkcs12 -inkey privkey.pem -in cert.pem -export -out privkey_cert.pfx -passout pass:[PASSWORD]
signtool 命令示例:
signtool sign /debug /f privkey_cert.pfx /p [PASSWORD] [EXECUTE_FILE.exe]
更新 2:
避免对 .spec 文件使用命令
$ pyinstaller FILE.spec
使用 Auto PY to EXE 代替 .spec
我不知道 .spec 文件会发生什么,但它产生的单个可执行文件比 .py 文件产生的问题更多
更新 3:
确保每次在执行auto-py-to-exe之前清除auto-py-to-exe“Building directory”,你可以执行一些来获取临时文件夹路径。
例如:
输出
Running auto-py-to-exe v2.9.0
Building directory: C:\Users\John\AppData\Local\Temp\tmpevxvuugz
Provided command: pyinstaller --noconfirm --onefile --windowed ...
更新 4:
我重新安装了整个windowsos,然后运行同样的东西,没有清除“构建目录”,结果没问题!我重新考虑是病毒感染了“建筑目录”造成的这一切问题
我的环境是pycharm使用的是venv环境,最后打开权限总是有问题。我把pycharm的python环境改成系统环境,运行就正常了
使用 --clean
参数清理 PyInstaller 缓存并在构建前删除临时文件。
参见:https://pyinstaller.readthedocs.io/en/stable/usage.html#cmdoption-clean
python -m pyinstaller --name "MyApp" "./" --clean
这解决了我的错误。
当我的当前目录设置为 C:\Users\[User]\Desktop\[Some-Folder]
.
时,我遇到了这个问题
我通过将当前目录更改为 G:\[Some-Other-Folder]
.
解决了这个问题
据推测,这是可行的,因为后一个目录不需要那么多权限。
TL;DR 尝试将当前目录更改为不需要特殊权限的目录。
我给出这个答案是为了防止有人遇到我的情况。我花了很多时间尝试此处介绍的其他建议解决方案。但是,none 解决了我的文件权限错误。另外,虽然我下面的解决方案对我有用,但我仍然不明白为什么我一开始就收到权限错误。
请注意,我使用 pyenv 来管理多个发行版,但我认为这与问题无关。此外,Pyinstaller 在我使用它的几个不同 python 版本中以同样的方式失败。
另外,请注意,我知道我修改包源的答案是“错误的做法”,但它适用于我的边缘情况并允许我继续转发。
在尝试构建单个文件可执行文件时,当 PyInstaller 尝试访问创建的 .exe 以添加最终负载数据时,我一直遇到 PermissionError: [Errno 13] Permission denied
问题。如前所述,我尝试了在此处的其他答案中找到的所有 permission/admin/disable-defender 技巧,但大多数时候,构建过程一直因文件权限错误而失败。然而,我确实注意到,有时,PyInstaller 会在极少数情况下正确构建可执行文件,可能每二十次就有一次,我无法解释。最后,一时兴起,我决定直接修改 PyInstaller,让构建过程多尝试几次最终追加。
我修改了一个 PyInstaller 源文件,api.py
,尝试将最终的包追加多达十次。进行此更改后,构建过程会在第二次或第三次成功。通过此更改,第一次或第二次追加尝试通常会因相同的权限错误而失败,但第二次或第三次尝试成功,并且可正确构建可执行包。
我在第 737 行更改了 PyInstallers api.py:
来自
else:
# Fall back to just appending data at the end of the file
logger.info("Appending %s to EXE", append_type)
with open(self.name, 'ab') as outf:
with open(append_file, 'rb') as inf:
shutil.copyfileobj(inf, outf, length=64 * 1024)
到
else:
desparation = 10
while desparation:
desparation -= 1
try:
# Fall back to just appending data at the end of the file
logger.info("Appending %s to EXE", append_type)
with open(self.name, 'ab') as outf:
with open(append_file, 'rb') as inf:
shutil.copyfileobj(inf, outf, length=64 * 1024)
desparation = 0
except PermissionError as e:
logger.error(e)
一个好的解决方案是卸载 pyinstaller
并重新安装:
第一步
python.exe -m pip uninstall pyinstaller
第二步
尝试获取旧版本的 pyinstaller
及其依赖项
python.exe pip install pefile==2019.4.18
python.exe -m pip install pyinstaller==3.6
第三步
尝试将您尝试与 pyinstaller
一起使用的文件放入一个新文件夹中,例如:
C:\Projects
第四步
在一个文件中制作一个可执行文件
C:\Projects>C:\Python27\Scripts\pyinstaller.exe example_v3.py --onefile
尝试使用 PyInstaller 部署 Kivy 应用程序时,即使使用管理员 CMD,我也会收到权限被拒绝的错误。该文件夹为每个用户提供了所有打开的编辑选项。 Python 具有防火墙访问权限。如何解决这个问题?
PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "./"
422 INFO: PyInstaller: 3.3.1
422 INFO: Python: 3.6.5
424 INFO: Platform: Windows-10-10.0.17134-SP0
425 INFO: wrote C:\Users\theguy\Documents\Python\myapp-build\myapp.spec
426 INFO: UPX is not available.
427 INFO: Extending PYTHONPATH with paths
['C:\Users\theguy\Documents\Python',
'C:\Users\theguy\Documents\Python\myapp-build']
428 INFO: checking Analysis
428 INFO: Building Analysis because out00-Analysis.toc is non existent
429 INFO: Initializing module dependency graph...
432 INFO: Initializing module graph hooks...
434 INFO: Analyzing base_library.zip ...
3859 INFO: running Analysis out00-Analysis.toc
3861 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
required by C:\Anaconda3\python.exe
4398 INFO: Caching module hooks...
4402 INFO: Analyzing C:\Users\btdav\Documents\Python\
Traceback (most recent call last):
File "C:\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 101, in <module>
run()
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 94, in run
run_build(pyi_config, spec_file, **vars(args))
File "C:\Anaconda3\lib\site-packages\PyInstaller\__main__.py", line 46, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 791, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 737, in build
exec(text, spec_namespace)
File "<string>", line 16, in <module>
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 213, in __init__
self.__postinit__()
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__
self.assemble()
File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 415, in assemble
priority_scripts.append(self.graph.run_script(script))
File "C:\Anaconda3\lib\site-packages\PyInstaller\depend\analysis.py", line 201, in run_script
self._top_script_node = super(PyiModuleGraph, self).run_script(pathname)
File "C:\Anaconda3\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1334, in run_script
with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\Users\theguy\Documents\Python\myapp-build'
诀窍是在您正在构建的目录之外创建一个新目录,然后像下面的代码一样使构建引用 Kivy 应用程序的 main.py。这修复了权限错误,即使是来自常规 CMD。
PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "C:\Users\theguy\Documents\Python\myapp\main.py"
我 运行 遇到了同样的错误,发现当我在具有管理员权限的 PowerShell 中构建它时它起作用了。
报错信息显示“INFO: UPX is not available”,您需要导入UPX.exe,此问题将得到解决。
enter image description here
我遇到了同样的问题!
我发现是我的杀毒软件(Bitdefender)认为写出来的.exe是危险的,所以阻止了这个动作。
将我的工作文件夹添加到防病毒软件 Exclusions 后,然后重新启动计算机,就可以了。
更新:
您需要对您的 .exe 文件进行“代码签名”,以使防病毒软件认为它不那么危险。
在Windows中:
使用OpenSSL创建自签名,然后使用Win10 SDKsigntool.exe
OpenSSL 命令示例:
openssl genpkey -out privkey.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096
openssl req -new -x509 -key privkey.pem -out cert.pem -days 3650
openssl pkcs12 -inkey privkey.pem -in cert.pem -export -out privkey_cert.pfx -passout pass:[PASSWORD]
signtool 命令示例:
signtool sign /debug /f privkey_cert.pfx /p [PASSWORD] [EXECUTE_FILE.exe]
更新 2:
避免对 .spec 文件使用命令
$ pyinstaller FILE.spec
使用 Auto PY to EXE 代替 .spec
我不知道 .spec 文件会发生什么,但它产生的单个可执行文件比 .py 文件产生的问题更多
更新 3:
确保每次在执行auto-py-to-exe之前清除auto-py-to-exe“Building directory”,你可以执行一些来获取临时文件夹路径。
例如:
输出
Running auto-py-to-exe v2.9.0
Building directory: C:\Users\John\AppData\Local\Temp\tmpevxvuugz
Provided command: pyinstaller --noconfirm --onefile --windowed ...
更新 4:
我重新安装了整个windowsos,然后运行同样的东西,没有清除“构建目录”,结果没问题!我重新考虑是病毒感染了“建筑目录”造成的这一切问题
我的环境是pycharm使用的是venv环境,最后打开权限总是有问题。我把pycharm的python环境改成系统环境,运行就正常了
使用 --clean
参数清理 PyInstaller 缓存并在构建前删除临时文件。
参见:https://pyinstaller.readthedocs.io/en/stable/usage.html#cmdoption-clean
python -m pyinstaller --name "MyApp" "./" --clean
这解决了我的错误。
当我的当前目录设置为 C:\Users\[User]\Desktop\[Some-Folder]
.
我通过将当前目录更改为 G:\[Some-Other-Folder]
.
据推测,这是可行的,因为后一个目录不需要那么多权限。
TL;DR 尝试将当前目录更改为不需要特殊权限的目录。
我给出这个答案是为了防止有人遇到我的情况。我花了很多时间尝试此处介绍的其他建议解决方案。但是,none 解决了我的文件权限错误。另外,虽然我下面的解决方案对我有用,但我仍然不明白为什么我一开始就收到权限错误。
请注意,我使用 pyenv 来管理多个发行版,但我认为这与问题无关。此外,Pyinstaller 在我使用它的几个不同 python 版本中以同样的方式失败。
另外,请注意,我知道我修改包源的答案是“错误的做法”,但它适用于我的边缘情况并允许我继续转发。
在尝试构建单个文件可执行文件时,当 PyInstaller 尝试访问创建的 .exe 以添加最终负载数据时,我一直遇到 PermissionError: [Errno 13] Permission denied
问题。如前所述,我尝试了在此处的其他答案中找到的所有 permission/admin/disable-defender 技巧,但大多数时候,构建过程一直因文件权限错误而失败。然而,我确实注意到,有时,PyInstaller 会在极少数情况下正确构建可执行文件,可能每二十次就有一次,我无法解释。最后,一时兴起,我决定直接修改 PyInstaller,让构建过程多尝试几次最终追加。
我修改了一个 PyInstaller 源文件,api.py
,尝试将最终的包追加多达十次。进行此更改后,构建过程会在第二次或第三次成功。通过此更改,第一次或第二次追加尝试通常会因相同的权限错误而失败,但第二次或第三次尝试成功,并且可正确构建可执行包。
我在第 737 行更改了 PyInstallers api.py:
来自
else:
# Fall back to just appending data at the end of the file
logger.info("Appending %s to EXE", append_type)
with open(self.name, 'ab') as outf:
with open(append_file, 'rb') as inf:
shutil.copyfileobj(inf, outf, length=64 * 1024)
到
else:
desparation = 10
while desparation:
desparation -= 1
try:
# Fall back to just appending data at the end of the file
logger.info("Appending %s to EXE", append_type)
with open(self.name, 'ab') as outf:
with open(append_file, 'rb') as inf:
shutil.copyfileobj(inf, outf, length=64 * 1024)
desparation = 0
except PermissionError as e:
logger.error(e)
一个好的解决方案是卸载 pyinstaller
并重新安装:
第一步
python.exe -m pip uninstall pyinstaller
第二步
尝试获取旧版本的 pyinstaller
及其依赖项
python.exe pip install pefile==2019.4.18
python.exe -m pip install pyinstaller==3.6
第三步
尝试将您尝试与 pyinstaller
一起使用的文件放入一个新文件夹中,例如:
C:\Projects
第四步
在一个文件中制作一个可执行文件
C:\Projects>C:\Python27\Scripts\pyinstaller.exe example_v3.py --onefile