Чтобы прояснить этот вопрос, я написал следующий скрипт:
#!/usr/bin/python3
import os,sys
import time
try:
while True:
user = input("User: ")
if user == "root":
os.system("sudo -u root /bin/bash")
else:
time.sleep(2)
except:
print("Exiting...")
sys.exit(0)
Когда я запускаю этот скрипт, используя только python3
, все работает как положено.Там нет подробного сообщения об ошибке (из трассировки), если я, например, Ctrl C из программы (KeyboardInterrupt).Меня интересует только вывод «Exiting ...», поэтому я не указал KeyboardInterrupt, но для любого исключения, которое может произойти.Однако, когда я создаю файл ELF (для Linux), используя pyinstaller
(pyinstaller --onefile test.py
), я получаю вывод трассировки:
$ dist/test
User: ^CTraceback (most recent call last):
File "test.py", line 7, in <module>
test = input("User: ")
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 15, in <module>
print("Exiting...")
Также странно, что я не могу воспроизвести это каждый раз при выходе изпрограмма в строке input
, однако я могу на 100% воспроизвести вышеупомянутое, когда программа спит в time.sleep(2)
:
$ dist/test
User: ^CExiting...
$ dist/test
User: ^CExiting...
$ dist/test
User: ^CExiting...
Traceback (most recent call last):
File "test.py", line 7, in <module>
test = input("User: ")
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 15, in <module>
print("Exiting...")
KeyboardInterrupt
[18825] Failed to execute script test
$ dist/test
User: asd
^CTraceback (most recent call last):
File "test.py", line 12, in <module>
time.sleep(2)
KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 12, in <module>
time.sleep(2)
KeyboardInterrupt
[18833] Failed to execute script test
Есть ли способ сказать pyinstaller
, чтобы он не "пропускал" скриптимя (например: File "test.py"
) и строки фактического кода (например, test = input("User: ")
)?