如何添加和删除系统的环境变量“PATH”?

时间:2014-01-15 12:55:24

标签: python windows command-line registry environment-variables

如何永久添加系统环境变量“PATH”的路径?

我想只添加路径,如果它尚不存在。

此外,我想删除包含文件夹名称的所有路径,例如\myprogram是否为:

C:\path\to\myprogram\dist;D:\another\path\to\myprogram\dist;

5 个答案:

答案 0 :(得分:6)

import _winreg as reg
import win32gui
import win32con


# read the value
key = reg.OpenKey(reg.HKEY_CURRENT_USER, 'Environment', 0, reg.KEY_ALL_ACCESS)
# use this if you need to modify the system variable and if you have admin privileges
#key = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, reg.KEY_ALL_ACCESS) 
try
    value, _ = reg.QueryValueEx(key, 'PATH')
except WindowsError:
    # in case the PATH variable is undefined
    value = ''

# modify it
value = ';'.join([s for s in value.split(';') if not r'\myprogram' in s])

# write it back
reg.SetValueEx(key, 'PATH', 0, reg.REG_EXPAND_SZ, value)
reg.CloseKey(key)

# notify the system about the changes
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')

答案 1 :(得分:6)

这就是你需要的东西,它类似于jaraco.windows项目中的代码。和它一样,仅使用内置的Python模块 - 因此不需要首先下载和安装pywin32扩展。 此外,它兼容Python 2.6+和3.x并支持Unicode环境变量和值(在本例中为目录路径)。

请注意,更改永久系统级环境变量需要Windows管理员权限。

import ctypes
from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, LPVOID
LRESULT = LPARAM  # synonymous
import os
import sys
try:
    import winreg
    unicode = str
except ImportError:
    import _winreg as winreg  # Python 2.x

class Environment(object):
    path = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
    hklm = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
    key = winreg.OpenKey(hklm, path, 0, winreg.KEY_READ | winreg.KEY_WRITE)
    SendMessage = ctypes.windll.user32.SendMessageW
    SendMessage.argtypes = HWND, UINT, WPARAM, LPVOID
    SendMessage.restype = LRESULT
    HWND_BROADCAST = 0xFFFF
    WM_SETTINGCHANGE = 0x1A
    NO_DEFAULT_PROVIDED = object()

    def get(self, name, default=NO_DEFAULT_PROVIDED):
        try:
            value = winreg.QueryValueEx(self.key, name)[0]
        except WindowsError:
            if default is self.NO_DEFAULT_PROVIDED:
                raise ValueError("No such registry key", name)
            value = default
        return value

    def set(self, name, value):
        if value:
            winreg.SetValueEx(self.key, name, 0, winreg.REG_EXPAND_SZ, value)
        else:
            winreg.DeleteValue(self.key, name)
        self.notify()

    def notify(self):
        self.SendMessage(self.HWND_BROADCAST, self.WM_SETTINGCHANGE, 0, u'Environment')

Environment = Environment()  # singletion - create instance

PATH_VAR = 'PATH'

def append_path_envvar(addpath):
    def canonical(path):
        path = unicode(path.upper().rstrip(os.sep))
        return winreg.ExpandEnvironmentStrings(path)  # Requires Python 2.6+
    canpath = canonical(addpath)
    curpath = Environment.get(PATH_VAR, '')
    if not any(canpath == subpath
                for subpath in canonical(curpath).split(os.pathsep)):
        Environment.set(PATH_VAR, os.pathsep.join((curpath, addpath)))

def remove_envvar_path(folder):
    """ Remove *all* paths in PATH_VAR that contain the folder path. """
    curpath = Environment.get(PATH_VAR, '')
    folder = folder.upper()
    keepers = [subpath for subpath in curpath.split(os.pathsep)
                if folder not in subpath.upper()]
    Environment.set(PATH_VAR, os.pathsep.join(keepers))

样本用法:

print(Environment.get('path'))
append_path_envvar(r'C:\path\to\myprogram\dist')
append_path_envvar(r'D:\another\path\to\myprogram\dist')
print(Environment.get('path'))
remove_envvar_path(r'\myprogram')  # remove *both* added paths
print(Environment.get('path'))

答案 2 :(得分:0)

我在你的问题的路径中推断你有兴趣在Windows平台上这样做。

documentation描述了这个过程:

  

要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment注册表项,然后广播WM_SETTINGCHANGE消息,并将lParam设置为字符串“Environment”。这允许应用程序(如shell)获取更新。

答案 3 :(得分:0)

有一个Python软件包pathtub(我是作者),可以完成这项工作。您可以在GitHub上阅读代码和文档。

安装

pip install pathtub

用法示例

阅读路径

from pathtub import get_path

# Getting path (can be 'process' (default), 'user' or 'machine')
user_path = get_path('user')

print(user_path)
# C:\Program Files\Java\jdk-13.0.1\bin;C:\Programs;C:\Programs\apache-maven-3.6.2\bin;C:\Programs\cloc;C:\Programs\fciv;C:\Python\Python37;C:\Python\Python37\lib\site-packages\pywin32_system32;C:\Python\Python37\Scripts;C:\texlive\2018\bin\win32;C:\Users\USER\AppData\Local\Microsoft\WindowsApps;C:\Users\USER\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\USER\AppData\Roaming\npm

添加到路径

from pathtub import add_to_path
added = add_to_path(r'C:\Add this folder\to user path', mode='user')

print(added)
#True

# Adding duplicate entries is prevented
added = add_to_path(r'C:\Add this folder\to user path', mode='user')

print(added)
#False

从路径中删除

removed = remove_from_path(r'C:\Add this folder\to user path', mode='user')

print(removed)
#True

# Removing non-existing folder just returns False
removed = remove_from_path(r'C:\Add this folder\to user path', mode='user')

print(removed)
#False

要求

当前实现(v.1.1.2)使用Powershell进行永久的Path修改。我只用较新的版本(Python 3.7和3.8)对此进行了测试,但是我想它也应该在某些较旧的版本上也可以使用。

答案 4 :(得分:-1)

您应该检查os.environ。这是一个可以直接操作或通过os.putenv操作的字典:

  

将名为varname的环境变量设置为字符串值。这样   对环境的更改会影响以子程序开头的内容   os.system(),popen()或fork()和execv()。

因此:

>>> import os
>>> os.environ["PATH"] =  path_old + ":/tmp/hallo" 
>>> os.environ["PATH"] 
'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl:/tmp/hallo'

[更新]

根据to this answer,您可以通过Windows注册表

使其持久化