python subprocess custom ENV = environment can only contain strings 错误

python subprocess custom ENV = environment can only contain strings error

我正在尝试使用以下程序打开文件:

cmd = '"C:\Program Files\.....\rizomuv.exe" "c:\users\.....\temp\ODRizomExport.obj"'
my_env = os.environ.copy()
my_env['LMX_LICENSE_PATH'] = 'xxxx@xx.x.x.xxx'
subprocess.Popen(cmd, env = my_env)

我需要指定许可服务器才能打开软件,但无论我做什么我总是收到错误:

# TypeError: environment can only contain strings # 

我只传递许可证 env 路径还是传递整个 os.env + 许可证路径都没有关系。还是不会继续。

我在这里错过了什么? 我正在从 Maya 运行 python,试图将我的 geo 放入 RizomUV,但 RizomUV 需要浮动许可服务器位置才能启动。

我意识到我的问题可能与此有关:Why does Popen fail on Windows if the "env" parameter contains a unicode object? 但我不确定如何将其应用到我非常简单的脚本中。

比约恩

从评论来看,OP 的环境本身似乎在相关代码之前已经损坏(包含非 str 键 and/or 值),或者,正如 OP 所建议的那样,可能包含非 ascii 字符(Windows 上的一个问题),据报道,简单地调用 subprocess.Popen(cmd, env=os.environ) 也会引发相同的错误。

您可以使用以下内容检查值是否为 ASCII 字符串:

def is_ascii(s):
    try:
        s.encode('ascii')
        return True
    except (AttributeError, UnicodeEncodeError):
        return False

此 returns True 仅当 s 是字符串且不包含任何非 ASCII 字符时。

例如:

assert is_ascii('hello')
assert is_ascii('')
assert not is_ascii(1)
assert not is_ascii('été')

应用程序 1:发现有问题 key/values:

{k: v for k, v in os.environ.items() if not (is_ascii(k) and is_ascii(v))}

应用程序 2:您的代码,将环境的子集用于子进程

my_env = {k: v for k, v in os.environ.items() if is_ascii(k) and is_ascii(v)}
my_env['LMX_LICENSE_PATH'] = 'xxxx@xx.x.x.xxx'
subprocess.Popen(cmd, env=my_env)