web-dev-qa-db-ja.com

ImportError:cx_Freezeで名前MAXREPEATをインポートできません

フリーズしたアプリケーションを実行すると、フリーズしないで正常に動作するcx_Freezeで問題が発生します。

プログラムを実行すると、次のトレースバックが発生します。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 27, in <module>
    exec code in m.__dict__
  File "PythonApp/mainframe.py", line 3, in <module>
  File "/usr/local/lib/python2.7/site-packages/dbus/__init__.py", line 103, in <module>
    from dbus._dbus import Bus, SystemBus, SessionBus, StarterBus
  File "/usr/local/lib/python2.7/site-packages/dbus/_dbus.py", line 39, in <module>
    from dbus.bus import BusConnection
  File "/usr/local/lib/python2.7/site-packages/dbus/bus.py", line 39, in <module>
    from dbus.connection import Connection
  File "/usr/local/lib/python2.7/site-packages/dbus/connection.py", line 27, in <module>
    import threading
  File "/usr/local/lib/python2.7/threading.py", line 44, in <module>
    module='threading', message='sys.exc_clear')
  File "/usr/local/lib/python2.7/warnings.py", line 57, in filterwarnings
    import re
  File "/usr/local/lib/python2.7/re.py", line 105, in <module>
    import sre_compile
  File "/usr/local/lib/python2.7/sre_compile.py", line 14, in <module>
    import sre_parse
  File "/usr/local/lib/python2.7/sre_parse.py", line 17, in <module>
    from sre_constants import *
  File "/usr/local/lib/python2.7/sre_constants.py", line 18, in <module>
    from _sre import MAXREPEAT
ImportError: cannot import name MAXREPEAT

私はLinuxを使用しており、ソースからビルドしたバージョンpython 2.7.4を使用しています。プロンプトから_sreをインポートすると機能し、MAXREPEATにアクセスできます絶え間ない。

これは通常、cx_Freezeにすべてを引き込まずにlibrary.Zipに引き下げられ、cx_Freezesセットアップインクルードリストでモジュールに明示的に名前を付けることで修正できます この同様の質問の解決策 しかし、それはここでは役に立ちませんでした。

この_sreモジュールは奇妙に見えます。生成された_sreにはlibrary.Zipファイルがありませんが、そのエラーからは検出できるようですが、そのシンボルをインポートできませんか?確かにモジュールがなかった場合、「No module named _sre」エラーが発生します。または、循環インポートが_sreスタブにインポートされていない可能性があります。

奇妙なことに、ファイルも見つからないようです-インポートすると、このモジュールは動的に作成されますか?

find /usr/local/lib/python2.7 -name "_sre*"

は何も返さず、インポートされた_sreモジュールにも__file__属性がないので、組み込みとして表示されるので、それを確実に含める方法を知りません。

>>> import _sre
>>> _sre.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
>>> repr(_sre)
"<module '_sre' (built-in)>"

これは この質問に似ています も最近尋ねられましたが、この場合、通常のインタープリターでエラーが発生していましたが、私にとってはcx_Freezeのみです。

編集する

python -vの実行は組み込みのように見えるので、cx_Freezeが実行できない理由や修正方法はわかりません。

...
# /usr/local/lib/python2.7/re.pyc matches /usr/local/lib/python2.7/re.py
import re # precompiled from /usr/local/lib/python2.7/re.pyc
# /usr/local/lib/python2.7/sre_compile.pyc matches /usr/local/lib/python2.7/sre_compile.py
import sre_compile # precompiled from /usr/local/lib/python2.7/sre_compile.pyc
import _sre # builtin
# /usr/local/lib/python2.7/sre_parse.pyc matches /usr/local/lib/python2.7/sre_parse.py
import sre_parse # precompiled from /usr/local/lib/python2.7/sre_parse.pyc
...
15
GP89

_sreモジュールに組み込まれています であるため、含めるファイルはありませんが、Python 2.7.3にMAXREPEAT属性がありません。 :

>>> import _sre
>>> _sre
<module '_sre' (built-in)>
>>> _sre.MAXREPEAT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'MAXREPEAT'

私の推測では、凍結されたコピーにはPython 2.7.4の標準ライブラリ.pyモジュールが何らかの形で含まれていますが、コンパイル済みのPython 2.7.3のインタプリタまたは以前のバージョンです。/usr/localから作業しているようです。/usrから古いバージョンを取得している可能性があります。

14
Thomas K

Ubuntu 12.10から13.04にアップグレードしたときにこの問題が発生しました。/usr/bin/pythonを/ path/to/my/env/bin /にコピーして修正すると、問題なく動作しました

cp /user/bin/python /path/to/my/env/bin/

または、これを修正するよりエレガントな方法があります( 参照 ):

mkvirtualenv <existing virtualenv name>

33
Johnny Zhao

他のすべてが失敗した場合、私はこれを使用して実行しています: http://www.kiwisoft.co.uk/blog/2014/08/17/fixed-importerror-cannot-import-name-maxrepeat

2
OrhanC1

最近同じ問題がありました。 LD_LIBRARY_PATH =を設定すると、問題が解決しました。

1
Mikhail

Win 8マシンでcx_freeze 4.3.2を使用していて、常にImportError: cannot import name MAXREPEAT with cx Freeze組み込みでないモジュールをフリーズしようとした場合、バージョン4.3.1をダウンロードすると、それが機能し、すべてのpython 3.3プログラムを問題なくフリーズできます。今。

1
PyBoy

私はWindows 8で同様の問題を抱えていました-ちょうどPYTHONPATHの問題でした。 pythonセッションに次のように入力して、PYTHONPATHが存在することを確認します。

oSをインポート

os.environ ['PYTHONPATH']。split(os.pathsep)

エラーが発生した場合は、このアプローチを使用してPYTHONPATHを設定してください。

Windows 7でpythonpathに追加する方法

0
Benor