python子流程custom ENV=环境只能包含字符串错误

2024-10-03 23:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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需要浮动许可服务器位置才能启动

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

比约恩


Tags: 文件路径程序服务器envcmdoslicense
1条回答
网友
1楼 · 发布于 2024-10-03 23:18:24

从注释中可以看出,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))}

应用程序2:您的代码,使用子流程的env子集

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)

相关问题 更多 >