当前位置: 代码迷 >> python >> python setup.py py2exe Invalid Syntax (asyncsupport.py, line 22)
  详细解决方案

python setup.py py2exe Invalid Syntax (asyncsupport.py, line 22)

热度:38   发布时间:2023-06-13 13:44:44.0

这个命令在我的个人电脑上运行良好,但在我的工作电脑上一直给我这个错误。 会发生什么? 我可以毫无问题地直接在 Powershell 中运行 Char_Limits.py 脚本。 错误:编译 'C:\\ProgramData\\Anaconda2\\lib\\site-packages\\jinja2\\asyncsupport.py' 失败 SyntaxError: invalid syntax (asyncsupport.py, line 22)

我的 setup.py 文件如下所示:

from distutils.core import setup
import py2exe

setup (console=['Char_Limits.py'])

我的文件看起来像:

import xlwings as xw
from win32com.client import constants as c
import win32api

""" 
Important Notes: Header row has to be the first row. No columns without a header row. If you need/want a blank column, just place a random placeholder
header value in the first row.
Product_Article_Number column is used to determine the number of rows. It must be populated for every row.
"""

#functions, hooray!
def setRange(columnDict, columnHeader):
    column = columnDict[columnHeader]
    rngForFormatting = xw.Range((2,column), (bttm, column))
    cellReference = xw.Range((2,column)).get_address(False, False)
    return rngForFormatting, cellReference

def msg_box(message):
    win32api.MessageBox(wb.app.hwnd, message)   

#Character limits for fields in Hybris
CharLimits_Fields = {"alerts":500, "certifications":255, "productTitle":300,
        "teaserText":450 , "includes":1000, "compliance":255, "disclaimers":9000, 
        "ecommDescription100":100, "ecommDescription240":240, 
        "internalKeyword":1000, "metaKeywords":1000, "metaDescription":1000,
        "productFeatures":7500, "productLongDescription":1500,"requires":500,
        "servicePlan":255, "skuDifferentiatorText":255, "storage":255, 
        "techDetailsAndRefs":12000, "warranty":1000}

# Fields for which a break tag is problematic.  
BreakTagNotAllowed = ["ecommDescription100", "ecommDescription240", "productTitle", 
                        "skuDifferentiatorText"]    

app = xw.apps.active                        
wb = xw.Book(r'C:\Users\XXXX\Documents\Import File.xlsx')

#identifies the blanket range of interest
firstCell = xw.Range('A1')
lstcolumn = firstCell.end("right").column

headers_Row = xw.Range((1,1), (1, lstcolumn)).value
columnDict = {}

for column in range(1, len(headers_Row) + 1):
    header = headers_Row[column - 1]
    columnDict[header] = column


try:
    articleColumn = columnDict["Product_Article_Number"]

except: 
    articleColumn = columnDict["Family_Article_Number"]

firstCell = xw.Range((1,articleColumn))

bttm = firstCell.end("down").row

wholeRange = xw.Range((1,1),(bttm, lstcolumn))
wholeRangeVal = wholeRange.value

#Sets the font and deletes previous conditional formatting
wholeRange.api.Font.Name = "Arial Unicode MS"
wholeRange.api.FormatConditions.Delete()

for columnHeader in columnDict.keys():
    if columnHeader in CharLimits_Fields.keys():
        rng, cellRef = setRange(columnDict, columnHeader)
        rng.api.FormatConditions.Add(2,3, "=len(" + cellRef + ") >=" + str(CharLimits_Fields[columnHeader]))
        rng.api.FormatConditions(1).Interior.ColorIndex = 3

    if columnHeader in BreakTagNotAllowed:
        rng, cellRef = setRange(columnDict, columnHeader)
        rng.api.FormatConditions.Add(2,3, '=OR(ISNUMBER(SEARCH("<br>",' + cellRef + ')), ISNUMBER(SEARCH("<br/>",' + cellRef + ")))")
        rng.api.FormatConditions(2).Interior.ColorIndex = 6

searchResults = wholeRange.api.Find("~\"")
if searchResults is not None:
    msg_box("There's a double quote in this spreadsheet")
else:
    msg_box("There are no double quotes in this spreadsheet")

# app.api.FindFormat.Clear
# app.api.FindFormat.Interior.ColorIndex = 3
# foundRed = wholeRange.api.Find("*", SearchFormat=True)

# if foundRed is None:
    # msg_box("There are no values exceeding character limits")
# else:
    # msg_box("There are values exceeding character limits")

# app.api.FindFormat.Clear
# app.api.FindFormat.Interior.ColorIndex = 6
# foundYellow = wholeRange.api.Find("*", SearchFormat=True)
# if foundYellow is None:
    # msg_box("There are no break tags in this spreadsheet")
# else:
    # msg_box("There are break tags in this spreadsheet")

笔记:

如果您正在阅读本文,我会先尝试 Santiago 的解决方案。

问题:

查看第 22 行可能出现的情况:

async def concat_async(async_gen):

这是利用了在 python 3.5 中添加的 async 关键字,但是 py2exe 最多只支持 python 3.4。 现在 jinja 看起来正在以某种方式扩展 python 语言(也许在运行时?)以在早期版本的 python 中支持这个 async 关键字。 py2exe 无法解释此语言扩展。

修复:

根据在 jinja2 2.9 版中添加了异步支持。 所以我尝试安装我的较早版本的 jinja(版本 2.8)。

我通过将%PYTHONHOME%\\Lib\\site-packages\\jinja2的内容移动到其他地方来备份我当前的 jinja 安装。 解压之前下载的 tar.gz 文件并通过 pip 安装包:

cd .\Downloads\dist\Jinja2-2.8 # or wherever you extracted jinja2.8
python setup.py install

作为旁注,我还必须增加递归限制,因为 py2exe 已达到默认限制。

from distutils.core import setup
import py2exe
import sys
sys.setrecursionlimit(5000)
setup (console=['test.py'])

警告:

如果您使用的任何东西都依赖于最新版本的 jinja2,那么在实际运行您的代码时,这可能会失败或产生意外的副作用。 我正在编译一个非常简单的脚本。

我在 python3.7 中编码时遇到了同样的问题。 我修复了将排除部分添加到我的 py2exe 文件的问题:

a = Analysis(['pyinst_test.py'],
         #...
         excludes=['jinja2.asyncsupport','jinja2.asyncfilters'],
         #...)

我从: :

  相关解决方案