2013-02-25 2 views
2

Я пытаюсь получить pyinstaller для работы с моим скриптом python, который не работает. Поэтому я попробовал очень простой скрипт:basic pyinstaller на MacOS X

#!/usr/bin/env python 
from matplotlib.pyplot import * 
from numpy import * 
x=linspace(0,2*pi,200) 
plot(x,sin(x)) 
show() 

Но это также не удается с сообщением об ошибке ниже. Я нахожусь на обновленном горном льве и использую приманный питон, если это имеет значение. Я называю это с python pyinstaller.py --onefile ../testpyinst.py находясь в директории pyinstaller и полный выход здесь:

23 INFO: wrote xxxxxxxxxxxxxx/pyinstaller-2.0/testpyinst/testpyinst.spec 
54 INFO: UPX is not available. 
1263 INFO: checking Analysis 
1337 INFO: checking PYZ 
1350 INFO: checking PKG 
1350 INFO: building because out00-PKG.toc missing or bad 
1350 INFO: building PKG out00-PKG.pkg 
Traceback (most recent call last): 
    File "pyinstaller.py", line 91, in <module> 
    main() 
    File "pyinstaller.py", line 86, in main 
    run_build(opts, spec_file) 
    File "pyinstaller.py", line 50, in run_build 
    PyInstaller.build.main(spec_file, **opts.__dict__) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 1625, in main 
    build(specfile, buildpath) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 1582, in build 
    execfile(spec) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/testpyinst/testpyinst.spec", line 16, in <module> 
    console=True) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 987, in __init__ 
    crypt=self.crypt) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 880, in __init__ 
    self.__postinit__() 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 315, in __postinit__ 
    self.assemble() 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/build.py", line 933, in assemble 
    archive.build(self.name, mytoc) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/loader/archive.py", line 202, in build 
    self.save_toc(tocpos) 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/loader/carchive.py", line 250, in save_toc 
    tocstr = self.toc.tobinary() 
    File "xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/loader/carchive.py", line 79, in tobinary 
    nmlen+entrylen, dpos, dlen, ulen, flag, typcd, nm+pad)) 
struct.error: argument for 's' must be a string 
+0

Ваш код выглядит хорошо, вам, вероятно, нужно разместите больше трассировки, чтобы люди могли видеть, где начинается ошибка (эта ошибка не из написанного и написанного сценария). – askewchan

+0

Спасибо, теперь я добавил полный вывод. –

ответ

1

Вы успешно построили что-нибудь с pyinstaller? Я предлагаю вам написать простой код, который не имеет внешних зависимостей,

print "Hello World!" 

или

f = open('test.txt','w') 
f.write("Hello World!") 
f.close() 

попытка импортировать стандартный библиотечный модуль, скажем math:

import math 
x = 10.0 
y = math.sqrt(x) 
print "square_root({}) = {}".format(x,y) 

Следующая попробуйте использовать numpy это просто печатает sin(x) вместо того, чтобы пытаться построить его.

from numpy import * 
x = linspace(0,2*pi,20) 
print sin(x) 

Если это работает, возможно, вместо show ИНГ сюжет, попробуйте savefig и посмотреть, если ошибка что-то делать с попыткой отобразить рисунок.

from matplotlib.pyplot import * 
from numpy import * 
x=linspace(0,2*pi,200) 
plot(x,sin(x)) 
savefig("/tmp/testfig.png") 

Если это еще не сработало, это может быть проблемой с вашим бэкэндом matplotlib. Используйте простой/более стандартно:

import matplotlib 
matplotlib.use("Agg") 
from matplotlib.pyplot import * 
from numpy import * 
x=linspace(0,2*pi,200) 
plot(x,sin(x)) 
savefig("/tmp/testfig.png") 
+0

Нет, даже с самой простой первой опцией 'print sin (x)', она не работает и дает ту же самую трассировку, что и раньше. –

+0

Что делать, если вы не пытаетесь импортировать что-нибудь? (отредактированный пост) – askewchan

+0

Это сработало. Итак, как мне заставить импорт работать? –

1

То, что я открыт этот файл xxxxxxxxxxxxxx/pyinstaller-2.0/PyInstaller/loader/carchive.py, и добавить несколько print() после строки 79. И я нашел нм + коврик не распознаются как строка. Однако это странно странно. Я использую окна 7, print() показывает, что nm=kernel32 и pad = ''.

Теперь поговорим о моей темп решения:

rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's', nmlen + entrylen, dpos, dlen, ulen, flag, typcd, nm + pad)) 

---- изменение ----->

try: 
    rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's', nmlen + entrylen, dpos, dlen, ulen, flag, typcd, nm + pad)) 
except: 
    ss = str(nm + pad) 
    rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's', nmlen + entrylen, dpos, dlen, ulen, flag, typcd, ss)) 

Не уверен, если это надежное решение, но оно работает мой. Я считаю, что вы можете использовать подобную технику, чтобы выяснить свою. BTW, я использую pyinstaller2.1 + python2.7.6. Команда pyinstaller -F MyApp.py --hidden-import=scipy.special._ufuncs_cxx

+0

Чтобы уточнить: измененные строки кода здесь решили проблему, когда ваш исполняемый файл вылетает всякий раз, когда вы наводите указатель мыши на график? Я смог найти эту линию, но, к сожалению, ее изменение не повлияло на меня. Является ли флаг скрытого импорта релевантным для этой проблемы? –

+0

Никогда не переходите к проблеме с мышью. Выше я пытаюсь решить структурную ошибку 's' в исходном сообщении. – hxu

0

Моя проблема была такой же, как описано в комментарии пользователя hxu; изменение

rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's', nmlen + entrylen, dpos, dlen, ulen, flag, typcd, nm + pad)) 

к

rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's', nmlen + entrylen, dpos, dlen, ulen, flag, typcd, nm.encode('utf8') + pad)) 

работал для меня, так как тип (нм) была 'Юникода', в то время типа (PAD) ул.

0

У меня была аналогичная проблема с Win7 и Pythonxy. мне пришлось отредактировать файл C:\Python27\Lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_carchive.py строки 84-85, и изменить nm + pad к str(nm + pad)

оригинал:

rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's',nmlen + entrylen, dpos, dlen, ulen, flag, typcd, nm + pad)) 

Fix:

rslt.append(struct.pack(self.ENTRYSTRUCT + repr(nmlen) + 's',nmlen + entrylen, dpos, dlen, ulen, flag, typcd, str(nm + pad)))