2011-09-15 4 views
13

PyInstaller을 통해 python 스크립트를 작성하려고합니다. 나는, 구성 스펙 파일을 생성하고, 구축하려면 다음 명령을 사용하고 있습니다 :PyInstaller, spec 파일, ImportError : 'blah'라는 모듈이 없습니다

# -*- mode: python -*- 
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'], 
      pathex=['/home/user/projects/icinga_python/releases/v2.1']) 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name=os.path.join('dist', 'myscript'), 
      debug=False, 
      strip=False, 
      upx=True, 
      console=1) 

이것은 dist/ 디렉토리에 실행 파일을 내장 :

여기
wget pyinstaller.zip, extracted it, python Configure.py, etc, then: 

python pyinstaller/Makespec.py --onefile myscript.py 
python pyinstaller/Build.py myscript.spec 

는 생성 된 사양 파일입니다. 이 파일을 실행하려고 할 때, 나는 다음을 얻을 : 나는 실제 파이썬 코드의 디렉토리에이 실행 파일을 이동 한 경우

Traceback (most recent call last): 
    File "<string>", line 12, in <module> 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook 
    raise ImportError, "No module named %s" % fqname 
ImportError: No module named mysql 

, 그것은 다른 결과 준 다음에

Traceback (most recent call last): 
    File "<string>", line 12, in <module> 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook 
    mod = _self_doimport(nm, ctx, fqname) 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport 
    exec co in mod.__dict__ 
    File "CLUSTER/mysql/icingasql.py", line 13, in <module> 
    import urllib2 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook 
    raise ImportError, "No module named %s" % fqname 
ImportError: No module named urllib2 

을 ... pyinstaller docs 나는 --onefile이 내가 필요로하는 옵션이지만, 어떤 이유로 모든 것이 컴파일되지는 않는다.

이 스크립트는 실제로 SQL 문에 대해 작성한 간단한 모듈을 포함하고 있지 않으며 특정 구문 분석 웹 사이트 에스.

+0

모든 라이브러리를 경로에 배치하거나 결국 PYTHONPATH에 배치하고 라이브러리 이동을 중지해야합니다. – Louis

+0

죄송합니다. 무엇을 하시겠습니까? spec 파일에 있습니까? – Cmag

+0

http://docs.python.org/tutorial/modules.html – Louis

답변

3

코드에 동적 가져 오기가있는 경우이 오류가 발생할 수 있습니다. 이 경우 pyinstaller는 해당 패키지를 exe 파일에 포함시키지 않습니다. 당신이 할 수있는 경우 :

  1. Tell pyinstaller to include it

하나의 파일 옵션은 코드를 실행에 아무 것도 변경하지 않는 코드에서이 패키지를 사용하지 않는 수입을 추가합니다. --onefile exe를 만들면 pyinstaller로 만든 모든 파일이 exe 파일로 압축되고 exe를 실행할 때마다 로컬 임시 파일로 압축이 풀립니다.

3

문제는 pyinstaller가의 두 번째 수준 을 볼 수 없다는 것입니다. 따라서 모듈 을 가져 오면 pyinstaller가이를 확인합니다. 그러나 A에 가져 오는 추가 모듈은 표시되지 않습니다.

파이썬 스크립트에서 아무 것도 변경할 필요가 없습니다. 누락 된 가져 오기를 사양 파일에 직접 추가 할 수 있습니다. 그냥 a = Analysis(...)에 다음을 추가 인수로 사양 파일과 그 실행 pyInstaller 중에 후

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'], 
     pathex=['/home/user/projects/icinga_python/releases/v2.1'], hiddenimports=["mysql"],) 

:이 결과이어야한다

hiddenimports=["mysql"], 

. 오늘 같은 문제가 발생했기 때문에

+0

고맙습니다 +1! 참고 : 나중에 pyinstaller를 실행할 때 .py 파일이 아닌 .spec 파일을 인수로 제공하십시오! (세부 사항을 위해 질문을 읽으십시오, 나는 처음으로 ...;)))) – ntg

0

는 거 내 2 센트를 추가 - 육년 이상 : D

Windows의 경우 :

1) cmd => rightclick => with admin rights 
2) Enter in cmd: "pip install pyinstaller" 
3) navigate in cmd to the folder of "yourMain.py" 
4) Enter in cmd: "pyinstaller --onefile --windowed yourMain.py" 

5) If you import other scripts/data in "yourMain.py": 
Manually enter the folder "dist" (gets created - where "yourMain.exe" should be by now), 
and copy your scripts or folder structure there 

(e.g. /assets/sounds; /assets/graphics; /scripts; anotherscript.py) 

그런 다음 나는 두 번 클릭하여 EXE 파일을 실행 할 수 있었다.

꽤 쉽습니다. 나에 대한 트릭은 "--onfile"이었고 다른 파일들을 "dist"폴더에 추가하는 것이 었습니다.

"--windowed"는 exe를 시작할 때 python 명령 창이 팝업되지 않도록하기위한 것입니다.