python PyInstaller UAC无法在onefile模式下工作

jtjikinw  于 2023-04-19  发布在  Python
关注(0)|答案(4)|浏览(138)

大家好。
我有一个小的python项目,想把它做成单个可执行文件。我正在使用...

  • Windows 7
  • Python 3.4
  • PyInstaller 3.2.1

我的PyInstaller命令是

PyInstaller -y -w -F -n output_file_name --uac-admin --clean source_file.py

这个命令工作正常。2但是单个输出文件在执行时不要求管理员权限。3并且在可执行文件图标上没有屏蔽标记。
去掉-F选项(相当于--onefile)时,输出的可执行文件图标上有屏蔽标记,并要求我管理员权限,但这不是我想要的,我想要一个单独的可执行文件。
我在dist\output_file_name文件夹中发现了一个清单文件(output_file_name.exe.manifest)。所以我...

PyInstaller -y -w -F -n output_file_name --manifest output_file_name.exe.manifest --uac-admin --clean source_file.py

但是这个命令不起作用。它的单个可执行文件仍然不要求管理员权限。
我已经删除了PyInstaller并安装了最新的开发版本。

pip install git+https://github.com/pyinstaller/pyinstaller.git@develop

但结果是一样的,它的输出没有图标上的屏蔽标记,也没有要求管理员权限。
你知道吗?
请帮帮我!

b09cbbtk

b09cbbtk1#

我找到问题所在了!
关键是...
1.安装PyInstaller 3.0
1.清单文件必须位于单个可执行文件所在的dist文件夹中
1.清单文件的名称必须与输出文件相同。
1.如果manifest文件位于dist文件夹中,则无需指定--manifest选项。--uac-admin就足够了。
1.您可以在build文件夹中找到清单文件。
谢谢大家。

vlurs2pr

vlurs2pr2#

添加passion053's答案,在我的情况下,我使用-F而不是--onefile,它对我来说很好,但是你需要在同一个目录中添加manifest文件作为你的单个可执行文件。

:我用的是pyinstaller版本3.5,我的版本很好用
编码快乐!

oknrviil

oknrviil3#

-r prog.exe.manifest,1添加到pyinstaller命令行对我来说很有效,之后就不需要将清单文件放在exe附近,纯单个exe文件。

eqzww0vc

eqzww0vc4#

如果你想更直接地控制程序何时请求管理员权限,或者如果你不想依赖PyInstaller,你可以使用the PyUAC module(适用于Windows)。使用以下命令安装:

pip install pyuac
pip install pypiwin32

该软件包的直接用途是:

import pyuac

def main():
    print("Do stuff here that requires being run as an admin.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    if not pyuac.isUserAdmin():
        print("Re-launching as admin!")
        pyuac.runAsAdmin()
    else:        
        main()  # Already an admin here.

或者,如果你想使用装饰器:

from pyuac import main_requires_admin

@main_requires_admin
def main():
    print("Do stuff here that requires being run as an admin.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    main()

然后,您可以在不使用UAC选项的情况下使用PyInstaller命令。
(from this answer

相关问题