Python time.sleep(1) вызывает TypeError?Python

Программы на Python
Ответить
Anonymous
 Python time.sleep(1) вызывает TypeError?

Сообщение Anonymous »

Я получаю это странное поведение (выдается случайное исключение TypeError) всякий раз, когда я прерываю/уничтожаю спящий родительский поток из дочернего потока в Python 3, но странное поведение появляется ТОЛЬКО в том случае, если сценарий Python был инициирован сценарием оболочки с & Аргумент , чтобы он работал в фоновом режиме.
Итак, вот минимальный воспроизводимый код 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
Это очень простой сценарий, в котором родительский поток инициирует дочерний поток, а затем зацикливается навсегда, а дочерний поток (через 1 секунду) прерывает основной поток, который СЛЕДУЕТ вызвать KeyboardInterruption в направлении основного потока.
Теперь, если я вызову свой сценарий с помощью сценария 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
И даже из однострочного сценария под названием m.sh, который выполняет 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 :)
Я совершенно ошеломлен и понятия не имею, какое отношение time.sleep и TypeErrors имеют к тому, как я вызывал свой скрипт и, в частности, вызывал его из сценария оболочки и из фонового режима. Это одна из самых странных ошибок, с которыми я когда-либо сталкивался.
Если это имеет значение, я использую Python 3.6.12 и Debian 9.12
Надеюсь, кто-нибудь сможет это понять.
РЕДАКТИРОВАТЬ: Вот сравнение байт-кода для вывода версии с ошибками (запускаемой из сценария оболочки с &)
А вот хорошая версия (запуск из терминала)
И для удобства сравнения вот разница байт-кода. Единственная разница — расположение дочернего потока в памяти.

Подробнее здесь: https://stackoverflow.com/questions/654 ... -typeerror
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»