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)
我正在尝试使用以下程序打开文件:
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)