微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加一个单一的Python可执行文件到多个计算机的Windows系统PATH?

我创build了一个命令行程序,我想分发给一些工作人员。 让他们都安装Python解释器是不现实的。 因此,我使用PyInstaller创build了一个.exe文件。 然而,我意识到,大多数人甚至不知道如何导航到.exe所在的目录,以便调用它。 (到目前为止,我还没有想出如何让程序运行时点击。)有没有办法让程序添加自己的用户sys PATH时,它是第一次运行或将这需要安装程序? 谢谢!

在外部exe程序上跳过“按任意键继续”

无法杀死Perl中的进程

文件位置运行Java中的.exe文件

检查.exe文件的权限级别

如何知道是否在80000003断点后面隐藏了一个不同的exception(WER对话框)

常见的陷阱是读PATH 。 通过使用os.environ('PATH')来变量。 这将是一个很大的错误,因为这个变量包含混合在一起的用户和系统路径。 这是PATH变量的特例。

你需要做的是从注册表 (用户部分)获取PATH env变量,如果需要更新它,然后写回来。

你可以使用winreg模块来实现,修改用户的PATH环境变量(或者如果这个特定用户不存在则创建)

读取用户PATH变量

如果存在,则标记路径(否则,路径列表认为空)

计算当前模块的路径(使用os.path.dirname(__file__) )

检查是否已经在路径中,如果是的话,退出(我打印路径列表,在这种情况下,你可以测试)

创建/更新PATH用户环境。 如果需要的话,更新路径列表

码:

import winreg,os script_directory = os.path.dirname(__file__) paths = [] key_type = winreg.REG_EXPAND_SZ # default if PATH doesn't exist try: keyQ = winreg.OpenKey(winreg.HKEY_CURRENT_USER,'Environment',winreg.KEY_QUERY_VALUE) path_old,key_type = winreg.QueryValueEx(keyQ,"PATH") winreg.CloseKey(keyQ) paths = path_old.split(os.pathsep) except WindowsError: pass if script_directory in paths: # already set,do nothing print(paths) else: # add the new path paths.append(script_directory) # change registry keyQ = winreg.OpenKey(winreg.HKEY_CURRENT_USER,winreg.KEY_WRITE) winreg.SetValueEx(keyQ,'PATH',key_type,os.pathsep.join(paths)) winreg.CloseKey(keyQ)

请注意,用户必须注销/登录才能使更改生效。 另一个解决方案是在PATH变量上调用setx 。 系统调用很丑,但立即生效。

# change registry with immediate effect import subprocess subprocess.call(["setx","PATH",os.pathsep.join(paths)])

或者,对eryksun提供一些python代码来将注册表更改传播到新进程。 无需注销,不需要丑陋的setx ,只需使用下面的代码调用broadcast_change('Environment') :

import ctypes user32 = ctypes.WinDLL('user32',use_last_error=True) HWND_broADCAST = 0xFFFF WM_SETTINGCHANGE = 0x001A SMTO_ABORTIFHUNG = 0x0002 ERROR_TIMEOUT = 0x05B4 def broadcast_change(lparam): result = user32.SendMessageTimeoutW(HWND_broADCAST,WM_SETTINGCHANGE,ctypes.c_wchar_p(lparam),SMTO_ABORTIFHUNG,1000,None) if not result: err = ctypes.get_last_error() if err != ERROR_TIMEOUT: raise ctypes.WinError(err)

(似乎我不得不重构我自己的一些代码,最后一点:))

ENV。 变量读取代码从这里: 如何只返回用户路径在环境变量没有访问注册表?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐