Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python子流程custom ENV=环境只能包含字符串错误_Python_String_Subprocess - Fatal编程技术网

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