62

I'm using Python 2.6 and cx_Freeze 4.1.2 on a Windows system. I've created the setup.py to build my executable and everything works fine.

When cx_Freeze runs, it moves everything to the build directory. I have some other files that I would like included in my build directory. How can I do this? Here's my structure:

src\
 setup.py
 janitor.py
 README.txt
 CHNAGELOG.txt
 helpers\
 uncompress\
 unRAR.exe
 unzip.exe

Here's my snippet:

setup

( name='Janitor',
 version='1.0',
 description='Janitor',
 author='John Doe',
 author_email='[email protected]',
 url='http://www.this-page-intentionally-left-blank.org/',
 data_files = 
 [ ('helpers\uncompress', ['helpers\uncompress\unzip.exe']),
 ('helpers\uncompress', ['helpers\uncompress\unRAR.exe']),
 ('', ['README.txt'])
 ],
 executables =
 [
 Executable\
 (
 'janitor.py', #initScript
 )
 ]
)

I can't seem to get this to work. Do I need a MANIFEST.in file?

asked Mar 31, 2010 at 14:44

4 Answers 4

118

Figured it out.

from cx_Freeze import setup,Executable
includefiles = ['README.txt', 'CHANGELOG.txt', 'helpers\uncompress\unRAR.exe', , 'helpers\uncompress\unzip.exe']
includes = []
excludes = ['Tkinter']
packages = ['do','khh']
setup(
 name = 'myapp',
 version = '0.1',
 description = 'A general enhancement utility',
 author = 'lenin',
 author_email = '[email protected]',
 options = {'build_exe': {'includes':includes,'excludes':excludes,'packages':packages,'include_files':includefiles}}, 
 executables = [Executable('janitor.py')]
)

Note:

  • include_files must contain "only" relative paths to the setup.py script else the build will fail.
  • include_files can be a list of string i.e a bunch of files with their relative paths
    or
  • include_files can be a list of tuples in which the first half of the tuple is the file name with the absolute path and the second half is the destination filename with the absolute path.

(When the lack of the documentation arises, consult Kermit the Frog)

Craig McQueen
43.8k32 gold badges138 silver badges188 bronze badges
answered May 23, 2010 at 17:31
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks Craig. I tried joining the mailing list that you're on but i wasn't allowed. Could you help me out please? Is it possible to specify the destination directory? the include_files option simply created the same directory structure in the builds directory and dumps the included files there. Thanks.
Solved this too. I went through the source. It's a pity that functions like there aren't documented well enough. I'd love to help to write some documentation for this.
The include_files list can contain both strings with relative path AND tuples with absolute path simultaneously. I had one odd file with an absolute path that I needed, and all the rest of my files were in the project folder. No problem.
Where is includes used for?
@danger89 includes is used to include modules. Very useful as sometimes cx_freeze doesn't include all of the required modules.
|
6

There's a more complex example at: cx_freeze - wxPyWiki

The lacking documentation of all the options is at: cx_Freeze (Internet Archive)

With cx_Freeze, I still get a build output of 11 files in a single folder, though, unlike with Py2Exe.

Alternatives: Packaging | The Mouse Vs. Python

answered Oct 19, 2011 at 9:18

3 Comments

cx_freeze will never support a single-file .exe file as the dev feels that the 'hacks' used to do such a thing are not clean. If you want a single file then you will have to stick with Py2exe, here is the feature request for Python3 support.
your link to missing documentation is now dead. If you still use this site, I'd love fore a pointer to the docs on options since I'm coming up short on them
J.F. Sebastian fixed the doc link to an archived copy. The current page appears to have less info.
3

In order to find your attached files (include_files = [-> your attached files <-]) you should insert the following function in your setup.py code:

def find_data_file(filename):
 if getattr(sys, 'frozen', False):
 # The application is frozen
 datadir = os.path.dirname(sys.executable)
 else:
 # The application is not frozen
 # Change this bit to match where you store your data files:
 datadir = os.path.dirname(__file__)
 return os.path.join(datadir, filename)

See cx-freeze: using data files

skrx
20.5k5 gold badges37 silver badges51 bronze badges
answered Aug 12, 2016 at 11:23

Comments

2

Also you can create separate script that will copy files after the build. It's what I use to rebuild the app on windows (you should have "GNU utilities for win32" installed to make "cp" works).

build.bat:

cd .
del build\*.* /Q
python setup.py build
cp -r icons build/exe.win32-2.7/
cp -r interfaces build/exe.win32-2.7/
cp -r licenses build/exe.win32-2.7/
cp -r locale build/exe.win32-2.7/
pause
answered Jun 8, 2014 at 8:56

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.