5

I am trying to compile a python script using pyinstaller with modules like scientific,MMTK. Pyinstaller was unable to include some .pyd modules so I copied them manually in the dist folder. When I executed the compiled exe it gave me following error:-

C:\Python27\hello\dist\hello>hello.exe
Traceback (most recent call last):
  File "", line 21, in 
  File "C:\Python27\iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "C:\Python27\iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/visual", line 1, in <module>
  File "C:\Python27\iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "C:\Python27\iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/visual.visual_all", line 1, in <module>
  File "C:\Python27\iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "C:\Python27\iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis", line 13, in <module>
  File "C:\Python27\iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "C:\Python27\iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.ui", line 3, in <module>
  File "C:\Python27\iu.py", line 477, in importHook
    mod = self.doimport(nm, ctx, ctx+'.'+nm)
  File "C:\Python27\iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.materials", line 159, in <module>
  File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.materials", line 129, in loadTGA
IOError: [Errno 2] No such file or directory: 'c:\\Python27\\hello\\build\\pyi.win32\\hello\\outPYZ1.pyz/turbulence3.tga'

BTW I can see the outPYZ1.pyz file at that location. Any idea?

Luke Woodward
  • 63,336
  • 16
  • 89
  • 104
user1144004
  • 183
  • 3
  • 4
  • 21

1 Answers1

14

It's not about pyd files, but about a TGA file not found. You need to adapt your software to look at a different location when the application is packaged by pyinstaller. According to Accessing to data files:

In a --onedir distribution, this is easy: pass a list of your data files (in TOC format) to the COLLECT, and they will show up in the distribution directory tree. The name in the (name, path, 'DATA') tuple can be a relative path name. Then, at runtime, you can use code like this to find the file:

os.path.join(os.path.dirname(sys.executable), relativename))

In a --onefile distribution, data files are bundled within the executable and then extracted at runtime into the work directory by the C code (which is also able to reconstruct directory trees). The work directory is best found by os.environ['_MEIPASS2']. So, you can access those files through:

os.path.join(os.environ["_MEIPASS2"], relativename))

So, if you open a file in your program, don't do:

fd = open('myfilename.tga', 'rb')

This method is opening the file from the current directory. So it will just not work for pyinstaller, because the current directory will be not the same than where the data will be put.

Depending if you are using --onefile, you must change to:

import os
filename = 'myfilename.tga' 
if '_MEIPASS2' in os.environ:
    filename = os.path.join(os.environ['_MEIPASS2'], filename))
fd = open(filename, 'rb')

Or if it's --onedir:

import os, sys
filename = os.path.join(os.path.dirname(sys.executable), 'myfilename.tga'))
fd = open(filename, 'rb')
Phantom
  • 91
  • 1
  • 11
tito
  • 12,990
  • 1
  • 55
  • 75
  • I'm quite new in python. Actually I don't know where or what this turbulence3.tga file is. I can run the script successfully before compiling. – user1144004 Mar 04 '12 at 11:56
  • Be able to run the script before doesn't mean anything. When you use pyinstaller, some defaults behavior must be adapted. Accessing to data files is one of them. – tito Mar 04 '12 at 16:39
  • But I never intended to access the turbulence3.tga file and I don't know its location or whatever this file is. Is this a system file? If it is then tell me the location so that I can use your above suggestion. – user1144004 Mar 04 '12 at 17:53
  • 2
    I don't know anything about your program, just this is in your backtrace: IOError: [Errno 2] No such file or directory: 'c:\\Python27\\hello\\build\\pyi.win32\\hello\\outPYZ1.pyz/turbulence3.tga'. You are the only one to understand what you're doing :) – tito Mar 05 '12 at 00:31