python子流程custom ENV=环境只能包含字符串错误
我正在尝试使用以下程序打开文件:python子流程custom ENV=环境只能包含字符串错误,python,string,subprocess,Python,String,Subprocess,我正在尝试使用以下程序打开文件: 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) 我需要为软件指定要打
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 #
不管我是只通过license env路径还是通过整个os.env+license路径。它仍然不会继续
我错过了什么?
我在Maya中运行python,试图将我的geo放入RizomUV,但RizomUV需要浮动许可服务器位置才能启动
我意识到我的问题可能与此有关:
但我不确定如何将其应用到我非常简单的脚本中
Bjorn从注释中可以看出,OP的环境本身在相关代码之前已经损坏(包含非
str
键和/或值),或者,正如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
仅当s
是字符串且不包含任何非ASCII字符时,才会返回True
例如:
assert is_ascii('hello')
assert is_ascii('')
assert not is_ascii(1)
assert not is_ascii('été')
应用程序1:查找有问题的键/值:
{k: v for k, v in os.environ.items() if not (is_ascii(k) and is_ascii(v))}
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)
应用程序2:您的代码,使用子流程的env子集:
{k: v for k, v in os.environ.items() if not (is_ascii(k) and is_ascii(v))}
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)
如果打印
my_env
,其中是否有任何非字符串值?请共享完整的堆栈跟踪。请提供并征服:如果省略第三行,即只需将env=os.environ.copy()
传递到子流程
,会发生什么?如果os.environ
本身包含带有非字符串的映射,但可能表明在这一点之前已经出现了一些问题,这会很奇怪。提示:如果没有shell=True
选项,cmd
应该是一个字符串列表:cmd=[“C:\\Program Files\\…\\rizomuv.exe”,“c:\\users\\…\\temp\\ODRizomExport.obj”];subprocess.Popen(cmd,env=my_env)
如果我省略第3行并只传递os.environ,我仍然会收到相同的错误。谢谢Pierre,你说得对。事实证明MAYA 2020是unicode,2020是一个数字而不是字符串。我将其转换为如下字符串:import os my_env=os.environ.copy()对于my_env中的e:如果不是str中的'str'(键入(my_env[e]):my_env[e]=str(my_env[e])