Embedding an executable within a py2app application - python

I have a python script that I want to package as a Mac application bundle with py2app. That script calls a CLI executable.
How do I embed that executable in the application bundle?
I tried to edit setup.py in order to include it as a Resource but in that case, execution privileges are lost. Moreover the strip stage of py2app raises an error. I wonder if there is a specific setup.py option that could copy the executable in Content/MacOS instead of Content/Resources.

Adding the CLI executable to the resources it the correct way to do it, but that doesn't work due to a bug in py2app (the file permissions aren't copied at the moment).
The easiest workaround is to reset the file permissions after calling py2app.

Related

How to place myapp in Applications location developed through py2app on mac osx

I had developed an app in python on mac osx for opening different file types on double-clicking any file. Then I converted into app by using py2app. py2app creates a myapp.app within dist folder. I moved myapp.app from dist folder to Applications location. Now, I am able to open any file through myapp just by double-clicking on it. Now, I want to make it work in such a way that, I don't need to drag and drop myapp to Applications location,it should automatically install on system.
You can use packagemaker. It makes myapp.pkg file that when double-clicked installa an app in Applications location.
py2app has a "--dist-dir" option for selecting the output directory (default is "diet"). That said, I have never tested using that option for installation in a directory containing other programs and don't know if "python setup.py py2app --dist-dir=/Applications" is save to use.
The alternative is to use a script that copies the application to /Applications (a simple python script, a shell script, or even a distutils command in your setup.py file that invokes py2app and then copies the resulting application to the right location).

Py2app issue: python binary does not have a shared library (or framework) at all

I am trying to build a distribution for a script. I have used py2exe to create an exe file and it works fine. I am trying to use py2app to create something similar for Mac.
However, I am getting this error when I use the command
python setup.py py2app
Error Message: python binary does not have a shared library (or framework) at all
Any idea why this is the case?
I am importing some modules like BeautifulSoup apart from the standard ones like urllib, math in the main script file
I am running the entire thing on a 64-bit Windows machine running python 2.7
You need to run py2app on a Mac.
The py2app code uses the copy of Python that's being used to run it to build the standalone executable. If that Python isn't a Mac build (which it won't be, if you're running on Windows), it won't be able to create a Mac executable.
Technically, the error message is telling you that it can't find the libpython.dylib or Python.framework associated with sys.executable, which is true, but could be more useful in this case.
There are alternatives to py2app, like cx_freeze, but they all work the same way: building an executable out of the Python installation used to run them.
So, if you want to build a Mac executable on Windows, there's no automated way to do it.
But there are a few possibilities.
First, you can buy a used Mac Mini for probably $100 or so. Get it set up for development, turn on Remote Login access (in the Sharing pane of Preferences) and leave it running in the corner. From Windows, you can use a little 4-liner ssh script to tell the Mac to check out the source, py2app it, zip up the result, and scp it over to the Windows box (or copy it via Windows file sharing, or ftp it, or check it into source control, or whatever).
If that's not feasible for some reason, hopefully you can at least get access to a Mac once in a while. (If not, how are you ever going to test things?). If so, you can build an app with py2app and zip it up to use as a template. Each time you want to make a new build, you can do that on Windows, just by modifying what's in the template.
The main foo.py script goes in foo.app/Contents/Resources/foo.py. Any other Python modules (whether standard-library, third-party, or your own code), with a few exceptions, go into the fake-standard-library zipfile in foo.app/Contents/Resources/lib. Any C extension modules go into a directory like foo.app/Contents/Resources/lib/python2.7/lib-dynload.
As long as you don't modify any C extensions, upgrade to a new version of Python, or add new third-party libraries that you don't know how to install manually (e.g., because you got them as an egg via easy_install), this will continue to work. If you do any of those things, you'll need to go back to the Mac and create a new template with py2app.
If you don't have access to a Mac at all, you may be able to find a pre-built py2app-generated app for some other project that happens to contain everything you need, in which case you can use it as a template. But this is a huge stretch.

py2app -- importing external modules

Can py2app be set up such that the typical contents of a user's sys.path (when running python, not a py2app .app) are appended at the end of the path that py2app sets up?
I am bundling an application with an interactive python prompt -- I would like other users to be able to use modules they have built, but which are not provided in the main .app. If they try to import something that is bundled with py2app, I'd prefer that the py2app version be used.
The --use-pythonpath and --site-packages options to py2app don't seem to add all the directories that regular python does.

How can I make portable python desktop application?

The requirement is to make an application portable, meaning no installer. I looked at py2exe and I am afraid I need to run install if I want to run it under Windows.
So my question is, can I make a portable python desktop application without any installation (all dependencies and libs are packaged), dragging from USB / CD will run it?
(This is critical because it's a headache for users to install C++ Run Time library...)
Thanks.
You can use this method with py2exe: http://www.py2exe.org/index.cgi/SingleFileExecutable
Basically, you use NSIS to package all of the required files and folders into a single executable. When you run it, the required files are expanded to a temporary directory, the executable is run, and when it exits, the temporary files are deleted automatically.
There is also an example that comes with py2exe which uses Inno Setup instead of NSIS to achieve the same result. It's installed to site-packages\py2exe\samples\extending.
You can also fork Portable Python and modify to include your application and libraries you need. It runs from any drive/network location without installation and you can pick do you want 2.x.x or 3.x.x based Python core

How to deploy Python to Windows users?

I'm soon to launch a beta app and this have the option to create custom integration scripts on Python.
The app will target Mac OS X and Windows, and my problem is with Windows where Python normally is not present.
My actual aproach is silently run the Python 2.6 install. However I face the problem that is not activated by default and the path is not set when use the command line options. And I fear that if Python is installed before and I upgrade to a new version this could break something else...
So, I wonder how this can be done cleanly. Is it OK if I copy the whole Python 2.6 directory, and put it in a sub-directory of my app and install everything there? Or with virtualenv is posible run diferents versions of Python (if Python is already installed in the machine?).
I also play before embedding Python with a DLL, and found it easy but I lost the ability to debug, so I switch to command-line plug-ins.
I execute the plug-ins from command line and read the STDOUT and STDERR output. The app is made with Delphi/Lazarus. I install others modules like JSON and RPC clients, Win32com, ORM, etc. I create the installer with bitrock.
UPDATE: The end-users are small business owners, and the Python scripts are made by developers. I want to avoid any additional step in the deployment, so I want a fully integrated setup.
Copy a Portable Python folder out of your installer, into the same folder as your Delphi/Lazarus app. Set all paths appropriately for that.
You might try using py2exe. It creates a .exe file with Python already included!
Integrate the python interpreter into your Delphi app with P4D. These components actually work, and in both directions too (Delphi classes exposed to Python as binary extensions, and Python interpreter inside Delphi). I also saw a patch for Lazarus compatibility on the Google Code "issues" page, but it seems there might be some unresolved issues there.
I think there's no problem combining .EXE packaging with a tool like PyInstaller or py2exe and Python-written plugins. The created .EXE can easily detect where it's installed and the code inside can then simply import files from some pre-determined plugin directory. Don't forget that once you package a Python script into an executable, it also packages the Python interpreter inside, so there you have it - a full Python environment customized with your own code.

Categories

Resources