【问题标题】:how to set PATH=%PATH% as environment in Python script?如何在 Python 脚本中将 PATH=%PATH% 设置为环境?
【发布时间】:2016-04-11 12:49:49
【问题描述】:

我正在尝试从 python 程序启动一个 exe 文件(exe 文件是使用 Visual Studio 编译的 c++ 项目的输出)。在这个c++项目的属性(配置->属性->调试->环境)中

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

是给定的。
有没有办法将路径环境变量设置为

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

在 python 程序中?

提前感谢您的重播

【问题讨论】:

  • Path 是一个操作系统环境变量,更改它可能会暂时(直到下次启动)损坏多个程序或库的访问路径。如果只在程序运行时需要修改路径,最好先保存一份原路径,然后加法修改,这样就可以在退出程序前设置成原来的值。 %PATH% 表示路径变量本身,是操作系统级别的一种附加设置路径变量的方式。如:如果路径为 C:\;C:\d1,PATH=%PATH%;C:\d2 等同于输入 PATH = C:\;C:\d1;C:\d2
  • 感谢 Lhsan 的详细解释。我之前有误解 % PATH% 。现在可以了
  • 如果您正在启动一个可执行文件,请使用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)

标签: python windows path


【解决方案1】:

重新发布 Yaron 的答案,但删除了 sys.path。正如他的帖子评论中所说, sys.path 用于模块搜索,而不是命令搜索。 PATH 用于命令搜索。

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

【讨论】:

  • 您的答案是正确的,但同时我已经提交了对票数最高的答案的修改。
【解决方案2】:

您可以使用多种方法更新 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"]

【讨论】:

  • 据我了解sys.path与Python模块搜索路径有关。它与 OS PATH 环境变量不同。 (实际上sys.path 与 PYTHONPATH 环境变量相关联。)
  • 将 .py 文件所在的当前文件夹添加到路径中(例如,如果您使用 ctypes 并在其中包含 .dll 文件):os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.abspath(__file__))。您必须在通过 ctypes 导入之前运行它。
【解决方案3】:

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

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

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

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')

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 2014-02-01
    • 2019-12-06
    • 2015-07-29
    • 1970-01-01
    • 2016-11-29
    • 2012-10-01
    • 2019-06-08
    • 2011-03-31
    相关资源
    最近更新 更多