Итак, вот минимальный воспроизводимый код Python, который я мог придумать, который может вызвать эту проблему.
Код: Выделить всё
User@MSI: ~/test $ cat m.py
import threading
import _thread
import time
def child_thread():
time.sleep(1)
print('child interrupting parent')
_thread.interrupt_main()
if __name__ == '__main__':
t = threading.Thread(target=child_thread, args=())
t.start()
print('parent looping')
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print('caught interruption raised from user or child thread :)')
except TypeError as e:
print('why would I ever catch a TypeError?')
raise
except Exception as e:
print('Strange Exception Received ')
raise
Теперь, если я вызову свой сценарий с помощью сценария bash с фоновым флагом & в конце,
( вывод ниже не имеет смысла)
Код: Выделить всё
User@MSI: ~/test $ cat ./m.sh
#!/bin/bash
python3 m.py &
User@MSI: ~/test $ ./m.sh
parent looping
child interrupting parent
why would I ever catch a TypeError?
Traceback (most recent call last):
File "m.py", line 17, in
time.sleep(1)
TypeError: 'int' object is not callable
- С терминала
li>
Из терминала с & - Из bash-скрипта (без &)
(вывод ниже выглядит так: ожидается)
Код: Выделить всё
User@MSI: ~/test $ python3 m.py
parent looping
child interrupting parent
caught interruption raised from user or child thread :)
(вывод ниже соответствует ожиданиям)
Код: Выделить всё
User@MSI: ~/test $ python3 m.py &
[1] 5884
parent looping
child interrupting parent
caught interruption raised from user or child thread :)
[1]+ Done python3 m.py
(вывод ниже соответствует ожиданиям)
Код: Выделить всё
User@MSI: ~/test $ cat m.sh
#!/bin/bash
python3 m.py
User@MSI: ~/test $ ./m.sh
parent looping
child interrupting parent
caught interruption raised from user or child thread :)
Если это имеет значение, я использую Python 3.6.12 и Debian 9.12
Надеюсь, кто-нибудь сможет это понять.
РЕДАКТИРОВАТЬ: Вот сравнение байт-кода для вывода версии с ошибками (запускаемой из сценария оболочки с &)
А вот хорошая версия (запуск из терминала)
И для удобства сравнения вот разница байт-кода. Единственная разница — расположение дочернего потока в памяти.
Подробнее здесь: https://stackoverflow.com/questions/654 ... -typeerror
Мобильная версия