loonghao / photoshop-python-api

Python API for Photoshop.
https://loonghao.github.io/photoshop-python-api/
MIT License
604 stars 68 forks source link

Flask库是否没办法使用这个工具呢? #254

Closed sgajs closed 1 year ago

sgajs commented 1 year ago

我试着用Flask构建网页窗口,并通过按钮经photoshop-python-api操控Photoshop。但用按钮操控时报错:photoshop.api.errors.PhotoshopPythonAPIError: Please check if you have Photoshop installed correctly.

不用flask构建的网页按钮则可以正常使用photoshop-python-api操控Photoshop。 以下是我的代码: python: from flask import Flask from photoshop import Session app = Flask(name) @app.route('/tryButton', methods=['GET','POST']) def tryButton(): with Session(r"C:\Users\out.psd", action="open") as app: doc = app.active_document if name == "main": app.run(debug=True, host="0.0.0.0",port=5000) return "File uploaded successfully"

Js: tryButton.addEventListener('click', function() { fetch('/tryButton', { method: 'GET', }).then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.blob(); }).then(blob => {

    }).catch(error => {
        console.error('Error:', error);
    });
});

HTML: <!DOCTYPE html>


是否是flask的多线程造成的?请问有什么好的解决办法吗?

loonghao commented 1 year ago

应该是可以的你可以参考这个 https://github.com/loonghao/photoshop-python-api/issues/161

sgajs commented 1 year ago

我试了下手动打开Photoshop再运行,还是不行,这是我的测试代码,大佬能帮我看下吗?

from flask import Flask
import photoshop.api as ps

app = Flask(__name__)
path=r"F:\lxzj.psd"

@app.route('/',methods=['GET'])
def index():
    a()
    return ''

def a():
    psapp=ps.Application()
    psapp.Open(path)
    psApp = psapp.Application.ActiveDocument

if __name__ == '__main__':
    app.run(debug=True)

我运行后进入http://127.0.0.1:5000 会报错: 1 2

sgajs commented 1 year ago

解决了,似乎因为flask是多线程的,使用pypsAPI时需要创建COM对象,为避免线程冲突和资源争夺,需要在使用前初始化一下com环境。直接运行好像因为python会自动回收处理COM环境而不受影响?修改代码如下:

from flask import Flask
import photoshop.api as ps
import pythoncom

app = Flask(__name__)
path=r"F:\try\lxzj.psd"

# @app.route('/',methods=['GET'])
@app.route('/')
def index():
    try:
        pythoncom.CoInitialize() #初始化com环境
        a()
    finally:
        pythoncom.CoUninitialize() #清理com环境
    return ''

def a():
    psapp=ps.Application()
    psapp.Open(path)
    psApp = psapp.Application.ActiveDocument

if __name__ == '__main__':
    # a()
    app.run(debug=True)

这样就可以正常运行了