My program in tkinter
is working well when I am running it using PyCharm
,
when I am creating .exe
file using pyinstaller,pyinstaller -i"icon.ico" -w -F script.py
I have no errors.
I am pasting script.exe
in same folder as my script.py
, and after running it I think in step where subprocess
is, it is not answering, because I haveprint
before subprocess line and its working.
Anyone know why?
This is the line with subprocess:
import subprocess
from subprocess import Popen, PIPE
s = subprocess.Popen([EXE,files,'command'],shell=True, stdout=subprocess.PIPE)
EDIT:
same problem with:
s = subprocess.check_output([EXE,files,'command'],shell=True, stderr=subprocess.STDOUT)
The most common reason a PyInstaller package fails is that PyInstaller failed to bundle a required file. Such missing files fall into a few categories: Hidden or missing imports: Sometimes PyInstaller can't detect the import of a package or library, typically because it is imported dynamically.
PyInstaller's bootloader is usually quite fast in one-dir mode, but it can be much slower in one-file mode, because it depacks everything into a temporary directory. On Windows, I/O is very slow, and then you have antiviruses that will want to double check all those DLL files. PyQt itself is a non-issue.
One of them call others through subporcess, but the others can't startup. The other applications work when startup through cmd or other applications not packed by pyinstaller2.0. pyinstaller 1.5 works.
There are some applications all packed by pyinstaller2.0 with --onefile option on windows. One of them call others through subporcess, but the others can't startup. The other applications work when startup through cmd or other applications not packed by pyinstaller2.0. pyinstaller 1.5 works.
I've been using Pyinstaller for a while for a PyQt4 application. It has worked great but recently I decided to change my build to be windowed with no console, the -w option. This new build almost works. I'm able to double-click the exe and run fine.
If you don't either redirect either all or none of stdin/out/err, an invalid handle error is thrown. See pyinstaller/pyinstaller#1339 . Even when this works right, you get an unsightly console window popping up because as a windowed app you don't have a console to share with it.
Use this function to get the command's output instead. Works with -F and -w option:
import subprocess
def popen(cmd: str) -> str:
"""For pyinstaller -w"""
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
process = subprocess.Popen(cmd,startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
return decode_utf8_fixed(process.stdout.read())
You can compile your code in -w mode or --windowed, but then you have to assign stdin and stderr as well.
So change:
s = subprocess.Popen([EXE,files,'command'],shell=True, stdout=subprocess.PIPE)
to:
s = subprocess.Popen([EXE,files,'command'],shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
Problem was solved by not using -w
command for generating exe file from .py script.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With