Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

subprocess seems not working in pyinstaller exe file

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)
like image 556
sygneto Avatar asked May 22 '18 08:05

sygneto


People also ask

Why is my PyInstaller exe not working?

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.

Why is PyInstaller so slow?

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.

Can pyinstaller call other programs through subporcess?

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.

Does pyinstaller--OneFile work on Windows?

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.

Does anyone use pyinstaller for PyQt4 applications?

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.

What happens if I don't redirect stdin/out/err in pyinstaller?

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.


3 Answers

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())
like image 118
TheClockTwister Avatar answered Sep 27 '22 00:09

TheClockTwister


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)
like image 27
Daan Wiltenburg Avatar answered Oct 01 '22 00:10

Daan Wiltenburg


Problem was solved by not using -w command for generating exe file from .py script.

like image 24
sygneto Avatar answered Sep 27 '22 00:09

sygneto