2011-09-15 45 views
13

Tôi đang cố gắng tạo tập lệnh python qua PyInstaller. Tôi đã sử dụng các lệnh sau để cấu hình, tạo ra một file spec, và xây dựng:PyInstaller, tệp spec, ImportError: Không có mô đun nào có tên 'blah'

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

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

Dưới đây là file spec nó tạo ra:

# -*- 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) 

này được xây dựng một tập tin thực thi trong dist/ thư mục. Khi cố gắng để chạy tập tin này, tôi nhận được như sau:

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 

Nếu tôi chuyển thực thi này vào thư mục của mã Python thực tế, nó đã cho kết quả khác nhau:

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 

Trong ... pyinstaller docs Tôi thấy rằng --onefile là tùy chọn tôi cần/muốn, nhưng vì một số lý do không phải mọi thứ đều được biên dịch.

Kịch bản không thực sự bao gồm bất kỳ thứ gì lạ mắt, chỉ mô-đun nhanh mà tôi đã viết cho câu lệnh sql và phân tích cú pháp nhất định trang mạng S.

+0

Tôi nên cố gắng đặt tất cả các lib trên đường dẫn hoặc cuối cùng trên PYTHONPATH và ngừng di chuyển thư viện. – Louis

+0

xin lỗi, làm gì? là trong tập tin spec? – Cmag

+0

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

Trả lời

3

Lỗi này có thể tăng gấp đôi khi bạn có nhập động trong mã của mình. Trong trường hợp đó, pyinstaller không bao gồm các gói đó trong tệp exe. Trong trường hợp đó bạn có thể:

  1. Thêm nhập khẩu không sử dụng những gói trong mã của bạn
  2. Tell pyinstaller to include it

Một lựa chọn tập tin không thay đổi bất cứ điều gì trong việc điều hành mã của bạn. Nếu bạn tạo --onefile exe, tất cả các tệp được tạo bởi pyinstaller sẽ được đóng gói thành tệp exe và được giải nén thành cục bộ mỗi khi bạn chạy exe.

3

Vấn đề là trình cài đặt pyrô sẽ không thấy nhập mức thứ hai. Vì vậy, nếu bạn nhập mô-đun A, pyinstaller sẽ thấy điều này. Nhưng bất kỳ mô-đun bổ sung nào được nhập trong A sẽ không được hiển thị.

Không cần thay đổi bất kỳ điều gì trong các tập lệnh python của bạn. Bạn có thể trực tiếp thêm hàng nhập bị thiếu vào tệp số spec. Chỉ cần thêm những điều sau đây trong a = Analysis(...):

hiddenimports=["mysql"], 

này phải là kết quả:

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

Sau đó chạy PyInstaller với file spec như một cuộc tranh cãi.

+0

thanx +1! Lưu ý: khi chạy pyinstaller sau đó, cung cấp làm đối số tệp .spec, không phải tệp .py! (đọc câu hỏi để biết chi tiết, tôi không phải là lần đầu tiên ...;)) – ntg

0

chỉ sẽ thêm 2 cent của tôi bởi vì tôi gặp phải cùng một vấn đề ngày nay - 6 năm sau: D

Đối với 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) 

Sau đó, tôi đã có thể chạy exe bằng cách nhấp đúp.

Hóa ra là khá dễ dàng. Điều gì đã làm cho các trick cho tôi là "- cấu hình" và thêm các tập tin khác của tôi vào thư mục "dist".

"--windowed" chỉ là cửa sổ lệnh python sẽ không bật lên khi bạn khởi động exe.