如何解决如何直接从python脚本修改Windows 10路径变量
我希望永久通过python脚本修改Windows中的path变量。该脚本是一个包装程序,可以帮助自动执行应用程序的安装,我想启用API以将应用程序添加到路径中。
例如,我想安装一个名为micro
的程序,该程序的安装路径为C:\Users\USERNAME\Path\to\micro
,然后将该安装路径添加到我的path变量中,这样我就可以运行micro
在我的终端上。
我已经知道2种可能的解决方案,但这两种都不起作用:
1。使用os.environ
在python中,os模块让您读取环境变量,但实际上并未对其进行修改。例如:
program_path = "C:\\Users\\USERNAME\\Path\\to\\micro"
new_path = f"{os.environ['PATH']};{program_path}"
os.environ["PATH"] = new_path
这将更新python脚本中的path变量,但实际上并没有在我想要的系统上对其进行修改。
2。 setx
我意识到可以在Windows中使用setx
命令来更新路径,但是由于Windows 10的某些原因,这会破坏您的path变量。
这个想法是,您可以从python调用setx
命令并使用它来更新path变量。您应该能够输入setx path "%path%;C:\Users\USERNAME\Path\to\micro"
并正确更新它。
例如,在python代码中,将是:
program_path = "C:\\Users\\USERNAME\\Path\\to\\micro"
subprocess.Popen(f'setx path "%path%;{program_path}"')
该应该采用当前路径变量并将程序路径附加到该变量,而只是擦除整个路径并用文字百分比替换路径%,然后是程序路径。
所以现在我的路径如下:
%path%
C:\Users\USERNAME\Path\to\micro
任何有关如何使它起作用的想法都会受到赞赏。
解决方法
好的,因此经过长时间(令人作呕)的研究,我找到了解决方案。这是我为跨平台系统添加PATH变量而想出的方法:
def add_to_path(program_path:str):
"""Takes in a path to a program and adds it to the system path"""
if os.name == "nt": # Windows systems
import winreg # Allows access to the windows registry
import ctypes # Allows interface with low-level C API's
with winreg.ConnectRegistry(None,winreg.HKEY_CURRENT_USER) as root: # Get the current user registry
with winreg.OpenKey(root,"Environment",winreg.KEY_ALL_ACCESS) as key: # Go to the environment key
existing_path_value = winreg.EnumValue(key,3)[1] # Grab the current path value
new_path_value = existing_path_value + program_path + ";" # Takes the current path value and appends the new program path
winreg.SetValueEx(key,"PATH",winreg.REG_EXPAND_SZ,new_path_value) # Updated the path with the updated path
# Tell other processes to update their environment
HWND_BROADCAST = 0xFFFF
WM_SETTINGCHANGE = 0x1A
SMTO_ABORTIFHUNG = 0x0002
result = ctypes.c_long()
SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW
SendMessageTimeoutW(HWND_BROADCAST,WM_SETTINGCHANGE,u"Environment",SMTO_ABORTIFHUNG,5000,ctypes.byref(result),)
else: # If system is *nix
with open(f"{os.getenv('HOME')}/.bashrc","a") as bash_file: # Open bashrc file
bash_file.write(f'\nexport PATH="{program_path}:$PATH"\n') # Add program path to Path variable
os.system(f". {os.getenv('HOME')}/.bashrc") # Update bash source
print(f"Added {program_path} to path,please restart shell for changes to take effect")
两者都不漂亮,但实际上确实有效。您确实需要重新启动运行中的shell才能使其生效,但除此之外,它是完美的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。