我创build了一个命令行程序,我想分发给一些工作人员。 让他们都安装Python解释器是不现实的。 因此,我使用PyInstaller创build了一个.exe文件。 然而,我意识到,大多数人甚至不知道如何导航到.exe所在的目录,以便调用它。 (到目前为止,我还没有想出如何让程序运行时点击。)有没有办法让程序添加自己的用户sys PATH时,它是第一次运行或将这需要安装程序? 谢谢!
在外部exe程序上跳过“按任意键继续”
无法杀死Perl中的进程
检查.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] 举报,一经查实,本站将立刻删除。