py2exe / py2app и docx не работают вместе

Установлен docx на Windows 7 здесь:

D: \ Program Files (x86) \ Python27 \ Lib \ site-packages, как показано ниже:

введите описание изображения здесь

Установлен docx в OS X в /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/docx-0.0.2-py2.7.egg-info, как показано ниже: введите описание изображения здесь

Ниже приведен пример сценария (с именем docx_example.py), который отлично работает на интерпретаторе python:

#!/usr/bin/env python ''' This file makes an docx (Office 2007) file from scratch, showing off most of python-docx's features. If you need to make documents from scratch, use this file as a basis for your work. Part of Python's docx module - http://github.com/mikemaccana/python-docx See LICENSE for licensing information. ''' from docx import * if __name__ == '__main__': # Default set of relationshipships - these are the minimum components of a document relationships = relationshiplist() # Make a new document tree - this is the main part of a Word document document = newdocument() # This xpath location is where most interesting content lives docbody = document.xpath('/w:document/w:body', namespaces=nsprefixes)[0] # Append two headings and a paragraph docbody.append(heading('''Welcome to Python's docx module''',1) ) docbody.append(heading('Make and edit docx in 200 lines of pure Python',2)) docbody.append(paragraph('The module was created when I was looking for a Python support for MS Word .doc files on PyPI and Stackoverflow. Unfortunately, the only solutions I could find used:')) # Add a numbered list for point in ['''COM automation''','''.net or Java''','''Automating OpenOffice or MS Office''']: docbody.append(paragraph(point,style='ListNumber')) docbody.append(paragraph('''For those of us who prefer something simpler, I made docx.''')) docbody.append(heading('Making documents',2)) docbody.append(paragraph('''The docx module has the following features:''')) # Add some bullets for point in ['Paragraphs','Bullets','Numbered lists','Multiple levels of headings','Tables','Document Properties']: docbody.append(paragraph(point,style='ListBullet')) docbody.append(paragraph('Tables are just lists of lists, like this:')) # Append a table docbody.append(table([['A1','A2','A3'],['B1','B2','B3'],['C1','C2','C3']])) docbody.append(heading('Editing documents',2)) docbody.append(paragraph('Thanks to the awesomeness of the lxml module, we can:')) for point in ['Search and replace','Extract plain text of document','Add and delete items anywhere within the document']: docbody.append(paragraph(point,style='ListBullet')) # Search and replace print 'Searching for something in a paragraph ...', if search(docbody, 'the awesomeness'): print 'found it!' else: print 'nope.' print 'Searching for something in a heading ...', if search(docbody, '200 lines'): print 'found it!' else: print 'nope.' print 'Replacing ...', docbody = replace(docbody,'the awesomeness','the goshdarned awesomeness') print 'done.' # Add a pagebreak docbody.append(pagebreak(type='page', orient='portrait')) docbody.append(heading('Ideas? Questions? Want to contribute?',2)) docbody.append(paragraph('''Email <python.docx@librelist.com>''')) # Create our properties, contenttypes, and other support files coreprops = coreproperties(title='Python docx demo',subject='A practical example of making docx from Python',creator='Mike MacCana',keywords=['python','Office Open XML','Word']) appprops = appproperties() contenttypes = contenttypes() websettings = websettings() wordrelationships = wordrelationships(relationships) # Save our document savedocx(document,coreprops,appprops,contenttypes,websettings,wordrelationships,'docx_example.docx') 

Ниже приведен сценарий установки (с именем docx_setup.py) для создания автономного (.app в Mac OSX и .exe в Windows 7):

 import sys,os # Globals: START main_script='docx_example' dist_dir_main_path=os.path.abspath('./docx-bin') compression_level=2 optimization_level=2 bundle_parameter=1 skip_archive_parameter=False emulation_parameter=False module_cross_reference_parameter=False ascii_parameter=False includes_list=['lxml.etree','lxml._elementpath','gzip'] # Globals: STOP # Global Functions: START def isDarwin(): return sys.platform=='darwin' def isLinux(): return sys.platform=='linux2' def isWindows(): return os.name=='nt' # Global Functions: STOP if isDarwin(): from setuptools import setup # Setup distribution directory: START dist_dir=os.path.abspath('%s/osx' %(dist_dir_main_path)) if os.path.exists(dist_dir): os.system('rm -rf %s' %(dist_dir)) os.system('mkdir -p %s' %(dist_dir)) # Setup distribution directory: STOP APP = ['%s.py' %(main_script)] OPTIONS={'argv_emulation': False, 'dist_dir': dist_dir, 'includes': includes_list } print 'Creating standalone now...' setup(app=APP,options={'py2app': OPTIONS},setup_requires=['py2app']) os.system('rm -rf build') os.system('tar -C %s -czf %s/%s.tgz %s.app' %(dist_dir,dist_dir,main_script,main_script)) os.system('rm -rf %s/%s.app' %(dist_dir,main_script)) print 'Re-distributable Standalone file(s) created at %s/%s.zip. Unzip and start using!!!' %(dist_dir,main_script) elif isWindows(): from distutils.core import setup import py2exe # Setup distribution directory: START dist_dir=os.path.abspath('%s/win' %(dist_dir_main_path)) if os.path.exists(dist_dir): os.system('rmdir /S /Q %s' %(dist_dir)) os.system('mkdir %s' %(dist_dir)) # Setup distribution directory: STOP OPTIONS={'compressed': compression_level, 'optimize': optimization_level, 'bundle_files': bundle_parameter, 'dist_dir': dist_dir, 'xref': module_cross_reference_parameter, 'skip_archive': skip_archive_parameter, 'ascii': ascii_parameter, 'custom_boot_script': '', 'includes': includes_list } print 'Creating standalone now...' setup(options = {'py2exe': OPTIONS},zipfile = None,windows=[{'script': '%s.py' %(main_script)}]) print 'Re-distributable Standalone file(s) created in the following location: %s' %(dist_dir) os.system('rmdir /S /Q build') 

Теперь возникает реальная проблема.

Ниже приведена ошибка, размещенная на консоли Mac OS X после попытки использования docx_example.app, созданного с помощью команды python docx_setup.py py2app:

 docx_example: Searching for something in a paragraph ... found it! docx_example: Searching for something in a heading ... found it! docx_example: Replacing ... done. docx_example: Traceback (most recent call last): docx_example: File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/__boot__.py", line 64, in <module> docx_example: _run('docx_example.py') docx_example: File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/__boot__.py", line 36, in _run docx_example: execfile(path, globals(), globals()) docx_example: File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/docx_example.py", line 75, in <module> docx_example: savedocx(document,coreprops,appprops,contenttypes,websettings,wordrelationships,'docx_example.docx') docx_example: File "docx.pyc", line 849, in savedocx docx_example: AssertionError docx_example: docx_example Error docx_example Exited with code: 255 

Ниже приведена ошибка, отправленная в файле docx_example.exe.log в Windows 7 после попытки использования файла docx_example.exe, созданного с помощью команды python docx_setup.py py2exe:

 Traceback (most recent call last): File "docx_example.py", line 75, in <module> File "docx.pyo", line 854, in savedocx WindowsError: [Error 3] The system cannot find the path specified: 'D:\\docx_example\\docx_example.exe\\template' 

Как вы можете видеть, как OS X, так и Windows 7 ссылаются на нечто подобное здесь. Пожалуйста помоги.

4 Solutions collect form web for “py2exe / py2app и docx не работают вместе”

То, что происходит (по крайней мере для py2exe), похоже на этот вопрос .

Документация по data_files находится здесь .

То, что вы в основном должны сделать, это изменить

 setup(options = {'py2exe': OPTIONS},zipfile = None,windows=[{'script': '%s.py' %(main_script)}]) 

в

 data_files = [ ('template', 'D:/Program Files (x86)/Python27/Lib/site-packages/docx-template/*'), ] setup( options={'py2exe': OPTIONS}, zipfile=None, windows=[{'script': '%s.py' %(main_script)}], data_files=data_files ) 

Точное место, где файлы шаблонов могут быть неправильно выше, так что вам, возможно, придется его отрегулировать.

Но может быть несколько других наборов data_files, которые вам нужно включить. Вы можете захотеть получить их программно с помощью команды os.listdir или os.walk .

Как упоминалось в другом посте, вам также придется изменить

 bundle_parameter=1 

в

 bundle_parameter=2 

в верхней части файла.

Вы можете решить всю проблему, используя этот API, который основан на python-docx . Преимущество API заключается в том, что у этого нет функции savedoc поэтому у вас не будет другого AssertionError .

Для WindowsError: [Error 3] The system cannot find the path specified: 'D:\\docx_example\\docx_example.exe\\template' вам необходимо отредактировать файл api.py папки с папкой docx, которая находится в папке Папка Python системы (на моем компьютере: C:\Python27\Lib\site-packages\python_docx-0.3.0a5-py2.7.egg\docx )

Изменение этого:

 _thisdir = os.path.split(__file__)[0] _default_docx_path = os.path.join(_thisdir, 'templates', 'default.docx') 

К этому:

 thisdir = os.getcwd() _default_docx_path = os.path.join(thisdir, 'templates', 'default.docx') 

Первый из них выполнял текущую программу и добавлял ее к пути для поиска папки templates .
C:\myfiles\myprogram.exe\templates\default.docx

Решение принимает только путь, а не запущенную программу.
C:\myfiles\templates\default.docx

Надеюсь, поможет!

Вместо того, чтобы менять какой-либо файл библиотеки, мне легче и проще сказать python-docx явно, где искать шаблон, то есть:

 document = Document('whatever/path/you/choose/to/some.docx') 

Это эффективно решает проблему пути py2exe и docx.

я нашел решение

в api.py

Из

 _thisdir = os.path.split(__file__)[0] 

к

 _thisdir = 'C:\Python27\Lib\site-packages\docx' 

Или что бы ни делал ваш файл docx

  • создание исполняемого файла с использованием python, vtk и py2exe
  • py2exe не может импортировать модуль из другого каталога
  • py2exe 64-разрядная версия python 2.7
  • как включить пакетный файл, py2exe
  • Python - Py2exe не может создать .exe, используя модуль «email»
  • Не удалось загрузить OpenCL runtime - OpenCV3 Python
  • Почему py2exe останавливается при «запуске»?
  • Проблема py2exe com dll
  • Python - лучший язык программирования в мире.