如何在Python脚本中将PATH=%PATH%设置为环境变量?

4
我将尝试为您翻译以下内容:

我正在尝试从Python程序中启动一个exe文件(该exe文件是使用Visual Studio编译的C ++项目的输出)。在此C ++项目的属性(配置 -> 属性 -> 调试 -> 环境)中,以下设置在

     (PATH = %PATH%;lib\testfolder1;lib\testfolder2) 

给定以下内容。
有没有办法在Python程序中设置路径环境变量为

  1. PATH = %PATH%
  2. lib\testfolder1
  3. lib\testfolder2

感谢您提前回复。


路径是操作系统环境变量,更改它可能会暂时损坏多个程序或库的访问路径(直到下一次启动)。如果仅需要在程序运行时修改路径,则最好保存原始路径的副本,然后进行增量修改,以便在退出程序之前将其设置为原始值。%PATH%表示路径变量本身,这是在操作系统级别上设置路径变量的一种方式。例如:如果路径为C:;C:\d1, PATH=%PATH%;C:\d2与键入PATH = C:;C:\d1;C:\d2相同。 - Volkan
1
感谢Lhsan的详细解释。我之前误解了%PATH%,现在它正常工作了。 - sasi
1
如果您要启动一个可执行文件,请使用subprocess.Popen或其中一个高级函数,例如subprocess.check_output,并使用其env选项将修改后的环境传递给子进程。例如:environ = os.environ.copy(); environ['PATH'] += os.pathsep + os.pathsep.join([r'lib\testfolder1', r'lib\testfolder2']); p = subprocess.Popen([exepath, arg1, arg2, ...], env=environ) - Eryk Sun
3个回答

7

您可以使用多种方法更新PATH:

import sys
sys.path += ["c:\\new\\path"]
print sys.path

或者

import os
os.environ["PATH"] += os.pathsep + os.pathsep.join(["c:\\new\\path"])
print os.environ["PATH"]

5
我的理解是sys.path与Python模块搜索路径有关,它与操作系统的PATH环境变量不同。实际上,sys.path与PYTHONPATH环境变量相关联。 - Bob
将当前包含.py文件的文件夹添加到路径中(例如,如果您使用ctypes并在其中有.dll文件):os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.abspath(__file__))。在通过ctypes导入之前必须运行此命令。 - user136036

2
重新发布Yaron的答案,但删除了sys.path。正如他在帖子评论中所说,sys.path用于模块搜索,而不是命令搜索。PATH用于命令搜索。
import os
os.environ["PATH"] += os.pathsep + os.pathsep.join(["c:\\new\\path"])
print os.environ["PATH"]

你的答案是正确的,但与此同时我已经提交了针对得票最高答案的编辑。 - Nathaniel Ruiz

0

这里是我创建的一个解决方案。它将检查路径是否已经存在,如果不存在,则会将其写入当前用户和计算机的注册表中。

我已经测试过,当前进程不会拥有更新后的环境变量,但是从运行命令启动的新命令行将会被更新。

请注意,当创建新窗口时,它将具有更新后的路径值。

def AppendWindowsPath(path):
  def AddPathInRegistry(HKEY, reg_path, new_path):
    reg = None
    key = None
    try:
      reg = ConnectRegistry(None, HKEY)
      key = OpenKey(reg, reg_path, 0, KEY_ALL_ACCESS)
      path_string, type_id = QueryValueEx(key, 'PATH')
      path_list = [f.strip("\r\n") for f in  path_string.split(';') if f]

      if new_path in path_list:
        print(new_path + " is already in %PATH%")
        return "ALREADY_IN_ENVIRONMENT"

      print("Adding " + new_path + " to %PATH%")
      SetValueEx(key, 'PATH', 0, REG_EXPAND_SZ, path_string + ";" + new_path)
      return "UPDATED_PATH"
    except Exception as e:
      print("ERROR while executing registry edit with " + str(HKEY) + "/" + reg_path)
      return "ERROR"
    finally:
      if key: CloseKey(key)
      if reg: CloseKey(reg)


  # Add the path to the current machine
  result_machine = \
    AddPathInRegistry(HKEY_LOCAL_MACHINE,
                      r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
                      path)

  # Update the path for the current user.
  result_user = \
    AddPathInRegistry(HKEY_CURRENT_USER, r'Environment', path)

  if ("UPDATED_PATH" in result_machine) or ("UPDATED_PATH" in result_user):
    # Updates Environment.
    win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接