具有变量设置的 Python subprocess.Popen

标签 python

我的一个 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)

但是不起作用。如何解决?

最佳答案

Popenenv 参数必须是映射(即字典)。

此外,您可能想要复制当前环境并添加到其中:

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/

相关文章:

python - 为 Django 应用程序选择哪个数据库引擎?

java - 将 wiki 转储解析为格式的适当方法是什么?

python - 创建一个函数来对方程的结果求和。请看,没那么简单?

python - 更新多列: the Username disappears

python - 网络爬虫 HTTP 错误 403 :Forbidden

python - Python 解释器欢迎信息可以被抑制吗?

python - 使用python3在Windows中创建文件的快捷方式(.lnk)

跨不同版本的 Python __getitem__ 行为

Python计算大文件中的单词数

python - pdf文件中的Scrapy抓取数据