How to create a Mac OS X app with Python?

46,847

Solution 1

How to configure py2app to include the source code in the executable, so the final users will not have access to my program?

Unless you very seriously hack the python interpreter (and include the mangled version) there is no really good way to hide the source from a moderately skilled and determined user. I strongly believe this is true on Windows also. Basically, whether you include true source or bytecode, a pretty clean version of the source can be recovered. More importantly, in my opinion, unless you include the actual source code (as opposed to bytecode, you will introduce a possible dependency on the interpreter version).

How to convert UNIX executable to Mac ".app" ?

What do you mean by a UNIX executable? A Darwin (OS X) binary [which isn't actually UNIX]? That can be done using the kinds of tools you already mentioned, but it must be done carefully to avoid library dependencies.

If all you want it a simple wrapper to put a command-line binary into a window, it's pretty easy to accomplish and the free XCode suite has several examples that would serve (depending on what output you wan to deliver, if any).

Is there a way to compile Python code with GCC ?

GCC does not compile Python. It's a different language (although there tools in the gcc family rthat support multiple language front-ends, but not Python). There are tools that attempt to translate Python into C, and then you can compile that into a true binary, but this only works for programs that avoid certain types of construct, and the process (and restrictions) need to apply your libraries as well.
One project to allow this is Cython. It works well for some types of code, mostly numerical code, but it is not trivial to install and exploit, very especially if you want to produce something that runs on multiple different computers.

In Windows it's easy, I created an "exe" file from Python code and it works. Is it possible to create a single file "app" for Mac ?

I would have to say I am skeptical -- very skeptical -- about this. Just like the OS X case, the exe almost certainly has the source code trivially accessible within it.

One fairly easy trick is to encrypt the source code and then decrypt it on the fly, but this seems to me like more trouble than it's worth.

Solution 2

PyInstaller will automatically create bundles under Mac OSX for windowed executables. When running ypinstaller.py, make sure to pass the option "--windowed".

This feature is documented in the website of pyinstaller

Solution 3

If you're not completely committed to wxPython (and for anyone else looking for a cross platform Python GUI framework), I recommend you check out Kivy. It's cross platform, GPU accelerated, and it will do the app packaging for you. It's easy to jump into, has a well thought-out architecture, and gives you an incredible amount of flexibility in terms of the interface. It's the best way I've found to make a cross platform Python GUI app.

Solution 4

cxFreeze was the choice. I use it pack my python program to a Mac OS X app. Which works like a charm.

Solution 5

Automator was already mentioned as a quick and simple solution for Pythons scripts that are contained in a single file, but since the Automator UI has so many options, and it is not obvious how to actually do it, I'll provide step-by-step instructions (verified to work on Yosemite):

  1. In Automator select File > New and pick Application as document type.
  2. Next, make sure Actions tab is selected on the left, and then in the search box type run. Among other options you'll see Run Shell Script — doubleclick it, and an editor window will appear in the right panel.
  3. From the Shell dropdown menu select /usr/bin/python.
  4. Paste your Python code into the edit window and then pick File > Save.

By default, the app will be saved under $HOME/Applications and will appear in Spotlight.

If you want to be able to set your own icon and have some fancy features, like task bar icons with a menu, log windows etc, then have a look at Platypus — an open-source app for creating MacOS native bundles.

Share:
46,847
Cristian Ciocău
Author by

Cristian Ciocău

Updated on January 12, 2020

Comments

  • Cristian Ciocău
    Cristian Ciocău over 4 years

    I want to create a GUI application which should work on Windows and Mac. For this I've chosen Python.

    The problem is on Mac OS X.

    There are 2 tools to generate an ".app" for Mac: py2app and pyinstaller.

    1. py2app is pretty good, but it adds the source code in the package. I don't want to share the code with the final users.
    2. Pyinstaller generates UNIX executable, so how to run it on Mac? I created a bundles with this executable, but the resulted ".app" is not working.

    The questions are:

    1. How to configure py2app to include the source code in the executable, so the final users will not have access to my program?
    2. How to convert UNIX executable to Mac ".app" ?
    3. Is there a way to compile Python code with GCC ?
    4. In Windows it's easy, I created an "exe" file from Python code and it works. Is it possible to create a single file "app" for Mac ?

    P.S. I use two computers (Windows and for Mac), Python 2.7, wxPython, py2exe, py2app and pyinstaller.

    Also, I have checked out these sites:

  • nneonneo
    nneonneo about 11 years
    Most of these tools only embed bytecode, which is not that easy to reverse-engineer. It's definitely possible, and easier than reverse-engineering compiled C (though not as easy as reversing unobfuscated Java or C#)
  • GregD
    GregD almost 11 years
    Reverse engineering bytecode is pretty easy, in my opinion. You don't get attractive maintainable code, but you expose any secrets. Also, some of these tools include true source code. Decompiling compiled code (like C) for reverse engineering is essentially impossible in practice (Yes, that is a generalization: I have done it successfully myself many times, and realize it can be done, but it's qualitatively different and only works in special cases).
  • Gank
    Gank over 9 years
    This solves my problem: it doesn't include my python source code unlike py2app does.
  • swdev
    swdev over 9 years
    But what about its desktop GUI native support? I believe it doesn't offer them. e.g, it didn't provide what we already knew as Combo Box.. only Spinner.
  • Jonathan Potter
    Jonathan Potter over 9 years
    @swdev Kivy won't have the same look as native controls because it has its own set of widgets. But that's a common tradeoff when you're coding cross platform GUIs.
  • swdev
    swdev over 9 years
    I guess you were right. But in this manner, PyQt is more suited to the overall "nativeness" when doing cross platform GUI
  • Jonathan Potter
    Jonathan Potter over 9 years
    @swdev True, Qt does nativeness exceptionally well.
  • Jonathan
    Jonathan over 8 years