26

根据我的阅读,对 Python 实例中环境变量的任何更改仅在该实例中可用,并且在实例关闭后消失。有没有办法通过将它们提交到系统来使它们坚持下去?

我需要这样做的原因是因为在我工作的工作室中,像 Maya 这样的工具严重依赖环境变量来配置跨多个平台的路径。

我的测试代码是

import os
os.environ['FAKE'] = 'C:\\'

打开另一个 Python 实例并请求os.environ['FAKE']生成一个KeyError.

注意:可移植性将是一个问题,但我正在编写的小 API 将能够检查操作系统版本并在必要时触发不同的命令。

也就是说,我已经走上了使用 Windows 注册表技术的路线,并且将简单地编写替代方法,当它们成为要求时,它们将在其他平台上调用 shell 脚本。

4

12 回答 12

18

您可以在命令行中使用 SETX。

默认情况下,这些操作在 USER 环境变量上进行。要设置和修改 SYSTEM 变量,请使用 /M 标志

import os
env_var = "BUILD_NUMBER"
env_val = "3.1.3.3.7"
os.system("SETX {0} {1} /M".format(env_var,env_val))
于 2013-08-16T22:35:26.800 回答
11

通过将它们提交给系统来使它们坚持下去?

我想你在这里有点困惑。没有“系统”环境。每个进程都有自己的环境作为其内存的一部分。一个进程只能改变它自己的环境。进程可以为其创建的进程设置初始环境。

如果您确实认为需要为系统设置环境变量,则需要查看在最初加载它们的位置(如 Windows 上的注册表或 Linux 上的 shell 配置文件)中更改它们。

于 2009-01-28T18:16:58.033 回答
6

在 Windows 下,您可以使用此配方通过注册表对环境变量进行持久更改,尽管这似乎有点过头了。

为了回应布赖恩的问题,你想要完成什么?可能有更简单的方法。

于 2009-01-28T17:09:48.763 回答
6

似乎有适用于 Windows 的更简单的解决方案

import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], shell=True)
于 2016-03-16T15:41:30.710 回答
5

我不相信你能做到这一点;我能想到两种解决方法。

  1. os.putenv函数为您开始使用的进程设置环境,即 os.system、popen 等。根据您要执行的操作,也许您可​​以拥有一个主 Python 实例来设置变量,然后生成新实例。

  2. 您可以运行 shell 脚本或批处理文件来为您设置它,但这变得不那么可移植了。见这篇文章:

http://code.activestate.com/recipes/159462/

于 2009-01-28T16:48:48.493 回答
3

这样想吧。

您没有设置 shell 环境变量。

您正在使用一些给定的环境变量设置生成一个子shell;这个子shell 使用修改后的环境运行您的应用程序。

于 2009-01-29T02:57:14.910 回答
2

根据这个讨论,你不能这样做。你想达到什么目的?

于 2009-01-28T16:46:09.730 回答
2

您正在分叉一个新进程,并且无法更改父进程的环境,因为如果您从 shell 启动新的 shell 进程,则无法更改

于 2009-01-28T16:46:48.417 回答
1

您可能想尝试由 Mark Hammond 开发的Python Win32 Extensions,它包含在ActivePython中(或可以单独安装)。您可以在Hammond 和 Robinson 的书中了解如何执行许多与 Windows 相关的任务。

使用PyWin32访问 windows COM 对象,Python 程序可以使用对象的环境属性(环境变量的集合)WScript.Shell

于 2009-01-28T19:05:00.357 回答
0

尝试使用允许您通过注册表设置变量的 py-setenv

python -m pip install py-setenv

于 2021-08-08T11:32:52.103 回答
-1

来自 Python 内部?不,做不到!

如果您未绑定到 Python,则应考虑使用 shell 脚本(sh、bash 等)。“source”命令允许您运行修改环境的脚本,并像您想要的那样“粘”到您“获取”脚本的 shell。这里发生的是 shell 直接执行脚本而不是创建一个子-process 执行脚本。

这将是非常便携的 - 您可以在 Windows 上使用 cygwin 来执行此操作。

于 2009-01-29T03:38:25.967 回答
-1

以防有人可能需要此信息。我意识到这是 7 年前问过的,但即使我有时也忘记了。.

是的,有一种方法可以让它们“粘”在窗户上。只需转到控制面板,系统,高级系统设置,当系统属性窗口打开时,您应该会看到环境变量的选项(按钮)。.根据您使用的操作系统(谷歌搜索),实现这一点的过程会有所不同。

选择它(单击按钮),然后将打开“环境变量”窗口。它有 2 个拆分窗口,最上面的一个应该是您的“用户名的用户变量”。. .选择“新”,然后简单地设置变量。例如,我的一个是“Database_Password = mypassword”。

然后在您的应用程序中,您可以像这样访问它们:import os, os.environ.get('Database_Password')。你可以做类似的事情pass = os.environ.get('Database_Password')

于 2016-07-17T08:45:49.613 回答