2017-02-08 1 views
3

Cette commande fonctionne correctement sur mon ordinateur personnel mais continue à me donner cette erreur sur mon PC de travail. Que pourrait-il se passer? Je peux exécuter le script Char_Limits.py directement dans Powershell sans problème. erreur: compilation 'C: \ ProgramData \ Anaconda2 \ lib \ site-packages \ jinja2 \ asyncsupport.py' a échoué SyntaxError: non valide (asyncsupport.py, ligne 22)python setup.py py2exe Syntaxe invalide (asyncsupport.py, ligne 22)

Mon fichier setup.py ressemble :

from distutils.core import setup 
import py2exe 

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

Mon fichier ressemble:

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") 

Répondre

6

La question:

En regardant ce qui est probablement à la ligne 22 sur the github package:

async def concat_async(async_gen): 

Cela rend l'utilisation du mot-clé async qui a été ajouté en Python 3.5, mais py2exe ne supporte que jusqu'à python 3.4. Maintenant jinja semble étendre le langage python d'une certaine façon (peut-être pendant l'exécution?) Pour supporter ce mot-clé async dans les versions antérieures de python. py2exe ne peut pas prendre en compte cette extension de langue.

Le Fix:

soutien async a été ajouté dans la version 2.9 jinja2 selon the documentation. J'ai donc essayé d'installer une version antérieure de jinja (version 2.8) que j'ai downloaded here.

J'ai fait une sauvegarde de mon installation jinja actuelle en déplaçant le contenu de %PYTHONHOME%\Lib\site-packages\jinja2 à un autre endroit. extraire le fichier tar.gz téléchargé précédemment et installez le paquet via pip:

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

Comme une note de côté, j'ai aussi dû augmenter ma limite de récursion parce py2exe a atteint la limite par défaut.

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

Attention:

Si tout ce que vous utilisez repose sur la dernière version de jinja2, cela peut échouer ou avoir des effets secondaires inattendus lors de l'exécution réellement votre code. Je compilais un script très simple.

+0

est-il un moyen de contourner cela pour Python 2.7? – battery514

+0

Découvrez ce que vous utilisez qui dépend de asyncsupport.py et supprimez cette dépendance. Vous pouvez utiliser un outil comme celui-ci pour vous aider: http://stackoverflow.com/a/30450999/3154314 –

+0

Alternativement (si votre script est assez facile à convertir en syntaxe python 3), vous pouvez utiliser python 3.5 et utiliser 'PyInstaller' pour le convertir en un exécutable comme suggéré ici: http://stackoverflow.com/a/33174611/3154314 –