Writing shell extensions in Python and compiling - python

I am trying to create a shell extension context menu and icon overlay. I have successfully registered and seen a context menu show up when right clicking and the menu clicks are correctly responding to the code when running the program through Python.
My issue is when I try to compile the Python code to an executable with cx_Freeze or py2exe. It builds the executable and running the executable creates a registry entry, but no menu shows up when right clicking after restarting explorer.exe.
I thought cx_Freeze or py2exe would be able to register the context menu or overlay and have it talk to the code within the exe. Do I need to make a dll file? I am not very familiar with com servers so anyone who has experience with shell extensions would be greatly appreciated.
I have more details if requested/needed.

I was able to get the context menu registered through a dll following the steps in this link. I ended up using py2exe for 2.7 and I am not sure if the setup they used is what fixed it or if I needed to use regsvr32 when registering the dll instead of the self registry executable. I also used a patched py2exe that is in the answer of the link
Link:
Com server build using Python on 64-bit Windows 7 machine

Related

How do I get my python app (compiled using pyinstaller) to appear in the windows start menu?

As the title says.
I have used pyinstaller to create my app from the python source code and it works perfectly. I would like to get the app to appear in the start menu but I don't know how to do this?
I have no experience with pyinstaller, but it looks like it's main function is to package Python code into an executable.
What you are looking for is an installation packager which packs all your files and configs into installations package (eg. msi). This package unpacks on the destination system into specified locations and creates all those icons in the start menu and on the desktop and etc.
Take a look at this question: How can I create an MSI setup?
Once your app is installed in the Program Files folder, add a new folder in
C:\ProgramData\Microsoft\Windows\Start Menu\
Then add a shortcut, .ink, in that folder to the .exe file in Program Files.
Your program will then show up in the start menu.

Installing a python script as a windows service or hidden

I wrote a script with a bunch of modules to convert txt files to pdfs. There's a watchdog module which checks a certain folder for newly created txts, python siphons the data into a latex template which is being compiled into a pdf.
I created my abomination in PyCharm and if I start the script within PyCharm, it works flawlessly. I compiled it as exe via 'pyinstaller --onefile' and it works flawlessly.
However, I need to run it as a windows service or at least without the window existing in the task bar because... reasons. I tried:
installing it as service via non-sucking service manager
starting it as hidden programme via a vbs script, powershell script and nircmd
and nothing helped. I'm at a loss here, there's no interaction whatsoever with the programme so it should work, also scripts are enabled on the machine and the process is visible in the task manager. I somehow suspect that it has problems calling other python scripts while it's a service or hidden programme but it doesn't seem to be logical and I have no means to verify anything whatsoever that I'm aware of.
My last idea is to somehow let it exist as a task bar tray thingy but that would be more than a shabby solution for this whole ordeal. Could anyone help me out here? Thanks

pywin installed, but PythonWin cannot open

I installed pywin from this site. I used version pywin32-220.win-amd64-py3.6.exe, and it installed without any error.
I am trying to automate use of a software. To do this, I am following a tutorial that says I need to select something from the Tools Menu in pywin. So I expected to find a program with a GUI that I could open from the Windows Start Menu.
However, although I see pywin in Control Panel's Add or Remove Programs, it is not in the start menu, and I don't know where to find it or how to open.
If my description is too vague to suggest a solution, a useful answer to my query would be diagnostic questions I should be asking.
Thank you.
Additional information:
- I am using windows 10.
PythonWin is what I want, yes. It is not in the start menu. (I understand now that pywin32 would not show in the start menu.)
There is a pywin folder on my desktop. One of the subfolders is called Pythonwin. Inside that folder, there is no .exe file. There is a file called start_pythonwin.pyw, but clicking it does not open anything. Based on this webpage, PythonWin needs to be installed separately. Perhaps that is my situation. But there is no .exe file in this folder. I do not know how to install a program from a folder of files--if that is what I need to do, please provide a reference.
Before I can automate use of the softare, the tutorial mentioned above provides the following instructions (sorry, it's on the software site and you have to login, so I can't link). I need to open the GUI to do step 1, but I can't open it.
Instructions:
Open PythonWin and start the COM Makepy utility from the Tools menu. Locate DesktopController Library in the list of COM interfaces and click OK. This produces the following result.
">>> Generating to C:\Python25\lib\site-packages\win32com\gen_py\62401B69-06B2-4C4F-992E-B7A57EFBF059x0x1x0.py
Building definitions from type library...
Generating...
Importing module
Press return and then import the COM support module by typing...(at this point, the tutorial explains how to write code to automate the software...)
I need to select something from the Tools Menu in pywin
I think you mean PythonWin (it comes with pywin32 installer). PythonWin comes with a few tools to use with Pywin32 (it's a GUI program, a Python editor actually and it has a Tools menu). Check your tutorial again and make sure what it is that you're looking for. I could have checked it out, but you didn't provide a link or a quote so it's hard to help you.
Anyway, if it is PythonWin what you are looking for (and I think it is), it should be located along side Python in your start menu.
Hope this helps.
Ok, now that you have updated your question I can help a bit more.
I don't understand how the installer didn't install PythonWin on your Python Start Menu but ok. Since what you want to do is execute makepy, there is another way to do it besides the PythonWin program.
Go to your site-packages folder, then win32com and then into the client directory. So the path will be something like C:\Python36\Lib\site-packages\win32com\client\. There you will find a file called makepy.py and another called makepy.pyc. Either one of those can be used to launch the makepy tool.
Once you have used the makepy tool to create the wrapper to your COM object you can find it in the gen_py directory.
You can comment to this answer if you have any questions.

How should I launch a Portable Python Tkinter application on Windows without ugliness?

I've written a simple GUI program in python using Tkinter. Let's call this program 'gui.py'. My users run 'gui.py' on Windows machines from a USB key using Portable Python; installing anything on the host machine is undesirable.
I'd like my users to run 'gui.py' by double-clicking an icon at the root of the USB key. My users don't care what python is, and they don't want to use a command prompt if they don't have to. I don't want them to have to care what drive letter the USB key is assigned. I'd like this to work on XP, Vista, and 7.
My first ugly solution was to create a shortcut in the root directory of the USB key, and set the "Target" property of the shortcut to something like "(root)\App\pythonw.exe (root)\App\gui.py", but I couldn't figure out how to do a relative path in a windows shortcut, and using an absolute path like "E:" seems fragile.
My next solution was to create a .bat script in the root directory of the USB key, something like this:
#echo off
set basepath=%~dp0
"%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
This doesn't seem to care what drive letter the USB key is assigned, but it does leave a DOS window open while my program runs. Functional, but ugly.
Next I tried a .bat script like this:
#echo off
set basepath=%~dp0
start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
(See here for an explanation of the funny quoting)
Now, the DOS window briefly flashes on screen before my GUI opens. Less ugly! Still ugly.
How do real men deal with this problem? What's the least ugly way to start a python Tkinter GUI on a Windows machine from a USB stick?
EDIT:
All the answers below were very good (py2exe, pyinstaller, small .exe, .wsf script.) The .wsf solution was the simplest, so I'm using it for now. I'll probably end up switching to one of the other three solutions if I want a prettier icon and the standard .exe extension. Thanks, everyone!
This Windows Scripting Host script (file extension .wsf) can be used instead of the batch file:
<job>
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
CMDFile = "App\\pythonw.exe App\\gui.py"
WshShell.Run CMDFile, 1
</script>
</job>
Update: Alternatively compile this C program and link an icon resource:
#include <windows.h>
#include <process.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return _spawnl(_P_NOWAIT, "App/pythonw.exe", " App/gui.py", lpCmdLine, NULL);
}
Update 2: To build an App.exe with icon, save the C code to app.c, create an Windows icon file app.ico, and save the following line to app.rc:
appicon ICON "app.ico"
Using Visual Studio 2008 Express, run these commands:
"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
rc.exe app.rc
cl.exe app.c /FeApp.exe /link app.res
Alternatively use "Visual Studio 2010 Express" or "Microsoft Windows SDK v7.0 for Windows 7 and .NET Framework 3.5 Service Pack 1" and adjust the commands accordingly.
Note that the icon will only be used for the App.exe starter program, not your Python program.
Use pyinstaller to zip up your distribution (the advantage over py2exe is that it knows different third-party libraries and is generally more up-to-date).
You can then create a .exe for your users to click upon to start your application. If you just copy the results of the pyinstaller build onto your USB drive you should be fine.
Make it to a single executable using py2exe.
You could do this in a hacky manner by writing you're own little C application that calls system('start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"'). Next you compile it without console and use it as a "shortcut".
The Short Answer:
This question was asked a few years ago, but I recently found a solution for a program I was working on that may still be useful for others. With this method, you will be able to create a standalone exe program launcher that can be placed anywhere and refer to a file in its same folder or subdirectory, while having a pretty icon of your choice and no DOS screen popping up. In other words, a true good-looking relative-path transportable shortcut file :)
The solution should be easy to follow and do even for non-programmers and goes as follows:
open notepad
write: %windir%\system32\cmd.exe /c start "" "%CD%\optional
subfolder\mainpy2exeGUI.exe"
save as "whatever.bat"
convert the bat-file to an exe file using a program called "BAT to EXE converter"
while checking the "invisible application" option, and selection the
icon file you want under the "versioninformations" tab. You can name
the output exe file to whatever you want. Link to the converter
program can be found at
http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/
The converter program download contains a 32 and 64-bit version, use the 32-bit version to make the shortcut usable by both older and newer PCs.
(note, this solutions is almost the same as suggested at http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/. However the current solution is different in terms of the code it uses in step2 which allows the launcher progam to be placed anywhere on a computer and not just on the top directory of a USB-stick, and is new to emphasize that the invisible option should be checked. Those differences are crucial.)
More Details (optional):
The original question was: "What's the least ugly way to start a python Tkinter GUI on a Windows machine from a USB stick?"
What was needed can be broken down to four things:
1. An exe program launcher.
2. That works on any computer and in any directory (i.e. it supports relative paths).
3. That has an icon.
4. That does not open an "ugly" DOS window.
There were several possible solutions suggested but none so far that satisfies all criteria. The original poster went for the ".wsf" option which allowed for relative paths and no ugly DOS window, but did not allow a custom icon or the recognizable exe file.
Part of the problem with the previously suggested solutions include:
you do not have C/VB programming skills or software.
you want an icon to your launcher program. Using a shortcut file that executes "cmd" and uses it to open your GUI file will allow you to set an icon file, BUT the icon file reference is absolute and will fail on any other computer than the one you created the shortcut file on.
you do not want the "ugly" DOS window flash. The cmd shortcut solution mentioned in the previous point creates a DOS window that flashes before opening your GUI.
Making the py2exe main executable file as the program launcher would almost be a perfect solution because it satisfies all criteria, but a backdraw with it is that the py2exe ececutable would require an ugly "tlc" folder to be placed in the same top-directory. It is therefore better to hide the main py2exe launcher in a nicely named subfolder. Also, there are many cases where one would like to keep the program launcher and the program itself as separate exe files, for instance if you are only using your main py2exe program to function as a python-runner that can launch open-ended editable python scripts that you can edit on the go without having to create a new py2exe file for each time you make a change to one of your scripts.
You can also fork Portable Python sources on GitHub and create shortcut in the same way other Portable Python shortcuts are created.
This gives you nice way to start app, icon, you can set custom registry/env variables if you need to, etc etc.
As an example you can take e.g. IDLE shortcut from Portable Python sources.
I've made a batch script (PyRunEXE) which compiles a simple Assembly Language code to make an EXE launcher for you:
https://github.com/SzieberthAdam/pyrunexe

Problems with Tkinter in py2exe

I made a a simple GUI program in python with tkinter and attempted to convert it to an .exe using py2exe. However, I've run into a problem. When I try to run the exe it flashes an error very quickly then disapears. So the best I could do was take a screan shot of the error.
How do I go about fixing this?
Edit
Velociraptors, this is my setup file. It's about as basic as it can be. How would I go about integrating init.tcl into the code?
from distutils.core import setup
import py2exe
setup(console=[r'C:\Python26\Random Password Generator.py'])
Does your setup.py script include init.tcl in the data_files option? The py2exe list of options says that's how you should include images and other required data files.
Edit:
Your setup script specifies that your program should be converted to a console exe. If you want a GUI program (which you do, since you're using Tkinter), you need to use the windows option:
setup(windows=[r'C:\Python26\Random Password Generator.py'])
Py2exe should correctly include Tkinter's dependencies. If not, you can manually include init.tcl:
setup(data_files=['C:\Python26\tcl\tcl8.5\init.tcl'],
windows=[r'C:\Python26\Random Password Generator.py'])
Ensure that tcl is installed in C:\Users\splotchy\lib\tcl8.5 or C:\Users\lib\tcl8.5.
If you want to see the error messages for longer, run your program from a command prompt.
I found a bug on the virutalenv site which suggested the following https://github.com/pypa/virtualenv/issues/93
for windows in your directory "C:\Environments\VirtualEnv\Scripts\activate.bat" just add which are set to the right path to TCL and TK for your python version
set "TCL_LIBRARY=C:\Python27\tcl\tcl8.5"
set "TK_LIBRARY=C:\Python27\tcl\tk8.5"
restart your cmd or shell
I believe that the TCL location have changed from there default ones.

Categories