我的一个 friend 给我写了一个 Python 脚本,它使用 subprocess.Popen
用 wine 启动 Photoshop。
#!/usr/bin/env python3
import subprocess, re, sys, signal
error_keywords = re.compile('^.*(Assertion|0x65372a0).*$')
success_keywords = re.compile('^.*(list_manager_QueryInterface).*$')
exited = False
process = None
successful_launch = False
timeout = 3
def kill_photoshop(signalnum, frame):
if not successful_launch:
print("No successful launch withing %d seconds, killing photoshop ..."%timeout, file=sys.stderr)
process.kill()
signal.signal(signal.SIGALRM, kill_photoshop)
while not exited:
process = subprocess.Popen(["wine64", "/home/artik/.wine/drive_c/Program Files/Adobe/Adobe Photoshop CC 2019/Photoshop.exe"], stderr=subprocess.PIPE)
successful_launch = False
signal.alarm(timeout)
while True:
if process.poll():
break
line = process.stderr.readline()
# print("got line %d and process %s"%(len(line),process.poll()))
if len(line) == 0 and process.poll() is not None:
if process.poll() == 0:
exited = True
break
if line:
print(line.strip())
if success_keywords.match(str(line)):
print("Successful photoshop launch detected", file=sys.stderr)
successful_launch = True
if error_keywords.match(str(line)):
print("Error keyword match, killing process", file=sys.stderr)
process.kill()
break
print("Process return code %d"%process.wait())
几天后修复了一个错误,为 wine 启动命令添加了一个设置。旧行:
wine64 "/home/artik/.wine/drive_c/Program Files/Adobe/Adobe Photoshop CC 2019/Photoshop.exe"
还有新的:
__GL_MaxFramesAllowed="1" wine64 "/home/artik/.wine/drive_c/Program Files/Adobe/Adobe Photoshop CC 2019/Photoshop.exe"
所以我必须将 __GL_MaxFramesAllowed="1"
添加到我的进程中。我尝试在脚本中添加一个变量:
my_env = __GL_MaxFramesAllowed="1"
我试过了
process = subprocess.Popen(["wine64", "/home/artik/.wine/drive_c/Program Files/Adobe/Adobe Photoshop CC 2019/Photoshop.exe"], env=my_env, stderr=subprocess.PIPE)
但是不起作用。如何解决?
最佳答案
Popen
的env
参数必须是映射(即字典)。
此外,您可能想要复制当前环境并添加到其中:
import os
# ...
# Copy current `os.environ` and add what's needed:
env = dict(os.environ, __GL_MaxFramesAllowed="1")
subprocess.Popen(..., env=env)
关于具有变量设置的 Python subprocess.Popen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041581/