Think I finally nailed this problem.
Running this test.py:
Code: Select all
import network
from wifi_functions import connect
from wifi_functions import disconnect
import utime
sta_if = network.WLAN(network.STA_IF) # create station interface
while True:
connect()
utime.sleep(5)
disconnect()
print ('disconnected')
utime.sleep(5)
and my wifi_functions.py
Code: Select all
import network
import utime
import machine
import config
sta_if = network.WLAN(network.STA_IF) # create station interface
ap_if = network.WLAN(network.AP_IF) # create access-point interface
def connect():
count = 0
# disconnects AP if it is up
ap_if.active(False) # de-activate the AP interface
utime.sleep(1)
if not sta_if.isconnected():
print('connecting to hotspot...')
sta_if.active(True)
sta_if.ifconfig((config.WiFi_device, '255.255.255.0', config.gateway, '8.8.8.8'))
sta_if.connect(config.hotspot, config.password)
while (count < 5):
count += 1
if (sta_if.isconnected()):
count = 0
print (' network config:', sta_if.ifconfig())
break
print ('.', end = '')
utime.sleep(1)
if (count == 5):
try:
with open('errors.txt', 'a') as outfile:
outfile.write('failed to connect' + 'n')
except OSError:
pass
# disconnect or you get errors
disconnect()
count = 0 # reset count
utime.sleep(1)
def disconnect():
# disconnects STA, even if it is not connected
sta_if.disconnect() # This is line 59
sta_if.active(False)
utime.sleep(1)
I would get this error:
Code: Select all
MPY: soft reboot
connecting to hotspot...
.....Traceback (most recent call last):
File "main.py", line 2, in <module>
File "test.py", line 12, in <module>
File "wifi_functions.py", line 59, in disconnect
OSError: Wifi Not Started
MicroPython v1.18 on 2022-01-17; ESP32 module with ESP32
Type "help()" for more information.
I guess it is not a surprise that trying to disconnect when you are NOT connected
might be an issue. Re-reading Shards response I thought I would put line 59
in a try … except block.
Code: Select all
def disconnect():
try:
# disconnects STA, even if it is not connected
sta_if.disconnect()
except:
pass
sta_if.active(False)
utime.sleep(1)
Voila!! No more … OSError: Wifi Not Started
When running test.py if you do a Ctrl C during the connection attempt, then another
CtrlD I get:
Code: Select all
MPY: soft reboot
connecting to hotspot...
E (63083) wifi:sta is connecting, return error
Traceback (most recent call last):
File "main.py", line 2, in <module>
File "test.py", line 10, in <module>
File "wifi_functions.py", line 24, in connect
OSError: Wifi Internal Error
MicroPython v1.18 on 2022-01-17; ESP32 module with ESP32
Type "help()" for more information
.
This suggests that:
Code: Select all
sta_if.connect(config.hotspot, config.password)
should be a try … except block. But that was what Shards recommended in the first place!!
I hope this is another step towards getting reliable WiFi access.
Thanks to both of you for your suggestions.
В разделе представлены исключения, которые возникают в результате ошибок, возникающих в ходе взаимодействия приложения Python и операционной системы и являются подклассами OSError
.
Содержание:
- Базовый класс исключений OSError
- Исключение OS BlockingIOError,
- Исключение OS ChildProcessError,
- Исключение OS ConnectionError,
- Исключение OS BrokenPipeError,
- Исключение OS ConnectionAbortedError,
- Исключение OS ConnectionRefusedError,
- Исключение OS ConnectionResetError,
- Исключение OS FileExistsError,
- Исключение OS FileNotFoundError,
- Исключение OS InterruptedError,
- Исключение OS IsADirectoryError,
- Исключение OS NotADirectoryError,
- Исключение OS PermissionError,
- Исключение OS ProcessLookupError,
- Исключение OS TimeoutError.
OSError([arg])
:
OSError(errno, strerror[, filename[, winerror[, filename2]]])
:
Исключение OSError()
возникает, когда системная функция возвращает системную ошибку, включая сбои ввода-вывода, типа таких, как «файл не найден» или «диск заполнен». Не срабатывает для недопустимых типов аргументов или других случайных ошибок.
Вторая форма конструктора устанавливает соответствующие атрибуты. У всех атрибутов по умолчанию None
если атрибут не указан. Для обратной совместимости, если переданы три аргумента, атрибут args
содержит только 2 кортежа из первых двух аргументов конструктора.
Конструктор часто фактически возвращает подкласс OSError
, как описано в исключениях ОС ниже. Конкретный подкласс зависит от конечного значения errno
. Это поведение имеет место только при построении OSError
напрямую или через псевдоним и не наследуется при создании подклассов.
OSError()
:
-
errno
— Числовой код ошибки из переменнойC
errno
-
winerror
— В Windows это дает вам собственный код ошибки Windows. Атрибутerrno
тогда является приблизительным переводом, в терминахPOSIX
, это нативный код ошибки.В Windows, если аргумент конструктора
winerror
является целым числом, атрибутerrno
определяется из кода ошибки Windows, а аргументerrno
игнорируется. На других платформах аргументwinerror
игнорируется, а атрибутwinerror
не существует. -
strerror
— Соответствующее сообщение об ошибке, предоставленное операционной системой. Он отформатирован функциями языкаC
perror()
подPOSIX
иFormatMessage()
под Windows. -
filename
иfilename2
— Для исключений, которые включают путь к файловой системе, напримерopen()
илиos.unlink()
.filename
— это имя файла, передаваемое функции. Для функций, которые включают два пути файловой системы, например,os.rename()
,filename2
— соответствует второе имя файла, переданное функции.
Исключения подкласса OSError.
Ниже перечисленные исключения, являются подклассом OSError()
и возникают в зависимости от системного кода ошибки.
BlockingIOError
:
Исключение BlockingIOError
поднимается, когда операция блокирует объект (например, сокет), установленный для неблокирующей операции. Соответствует errno EAGAIN
, EALREADY
, EWOULDBLOCK
и EINPROGRESS
.
В дополнение к таковым OSError
, BlockingIOError
может иметь еще один атрибут:
characters_written
— целое число, содержащее количество символов, записанных в поток до его блокировки. Этот атрибут доступен при использовании буферизованных классов ввода/вывода изio
модуля.
ChildProcessError
:
Исключение ChildProcessError
поднимается при сбое операции с дочерним процессом. Соответствует errno ECHILD
.
ConnectionError
:
Исключение ConnectionError
это базовый класс для вопросов, связанных с подключением.
Подклассы ConnectionError
:
-
BrokenPipeError
:Исключения
BrokenPipeError
это подклассConnectionError
, возникающий при попытке записи в канал, когда другой конец был закрыт, или при попытке записи в сокет, который был отключен для записи. Соответствуетerrno EPIPE
иESHUTDOWN
. -
ConnectionAbortedError
:Исключения
ConnectionAbortedError
это подклассConnectionError
, возникает, когда попытка соединения прерывается партнером. Соответствуетerrno ECONNABORTED
. -
ConnectionRefusedError
:Исключения
ConnectionRefusedError
это подклассConnectionError
, возникающий, когда одноранговый узел отклоняет попытку подключения. Соответствуетerrno ECONNREFUSED
. -
ConnectionResetError
:Исключения
ConnectionResetError
это подклассConnectionError
, возникающий при сбросе соединения узлом. Соответствуетerrno ECONNRESET
.
FileExistsError
:
Исключение FileExistsError
поднимается при попытке создать файл или каталог, который уже существует. Соответствует errno EEXIST
.
FileNotFoundError
:
Исключение FileNotFoundError
поднимается, когда файл или каталог не существует. Соответствует errno ENOENT
.
InterruptedError
:
Исключение InterruptedError
поднимается, когда системный вызов прерывается входящим сигналом. Соответствует errno EINTR
.
Python-3.5: Python теперь повторяет системные вызовы, когда системный вызов прерывается сигналом, кроме случаев, когда обработчик сигнала вызывает исключение вместо возбуждения InterruptedError
.
IsADirectoryError
:
Исключение IsADirectoryError
поднимается, когда к каталогу применяется файловая операция, например os.remove()
. Соответствует errno EISDIR
.
NotADirectoryError
:
Исключение NotADirectoryError
возникает, когда совершается попытка операции с каталогом, например os.listdir()
, а на самом деле путь не является каталогом. Соответствует errno ENOTDIR
.
PermissionError
:
Исключение PermissionError
поднимается при попытке запустить операцию без соответствующих прав доступа — например, прав доступа к файловой системе. Соответствует errno EACCES
и EPERM
.
ProcessLookupError
:
Исключение ProcessLookupError
поднимается, когда данный процесс не существует. Соответствует errno ESRCH
.
TimeoutError
:
Исключение TimeoutError
поднимается, когда время ожидания системной функции на системном уровне. Соответствует errno ETIMEDOUT
.
Сначала позвольте мне дать некоторую справочную информацию, которая приводит к проблеме. На моем ноутбуке с Win 8.1 были установлены / установлены две версии python. Первоначально Py 2.5 был установлен по умолчанию. Я сделал это так: я переименовал python.exe
в Python 3.5 как python35.exe
, а файл pythonw.exe
как pythonw35.exe
, которые, похоже, создали два файла .dll
с такими же именами, как у двух файлов (я не помню, присутствовали ли два файла dll до переименования) и успешно установил Python 2.7 по умолчанию (т.е. когда я набирал команду python
в командной строке, запускался python 2.7). Недавно мне нужно было установить Python 3.5 по умолчанию. Затем я аналогичным образом переименовал файлы версии Python 2.7
и вернул имена файлов версии 3.5 к их исходным нормальным форматам (то есть python.exe
и pythonw.exe
).
После всего этого хаоса я запускаю print("Hello World")
в IDLE, и возникает следующая ошибка:
IDLE internal error in runcode()
Traceback (most recent call last):
File "C:Python35-32libidlelibrpc.py", line 339, in putmessage
r, w, x = select.select([], [self.sock], [])
TypeError: argument must be an int, or have a fileno() method.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:Python35-32libidlelibrpc.py", line 240, in asyncqueue
self.putmessage((seq, request))
File "C:Python35-32libidlelibrpc.py", line 342, in putmessage
raise OSError("socket no longer exists")
OSError: socket no longer exists
3 ответа
Я также столкнулся с той же проблемой. Эта ошибка возникла из-за того, что мой файл был назван «коллекциями». Это означает, что если вы называете свои файлы какой-либо встроенной функцией, ключевым словом, модулем и т. Д., Эта ошибка возникнет.
Решение этой ошибки: проверьте, создали ли вы какой-либо файл с помощью какой-либо встроенной функции, ключевого слова, модуля и т. Д. Если да, то переименуйте имя файла, которое не связано с каким-либо ключевым словом python. Это будет работать как положено.
2
clemens
7 Фев 2018 в 17:44
Итак, я только что снова установил установку python 3.5.1, и все в порядке.
1
snow
7 Июн 2016 в 23:36
Если вышеуказанные решения не работают, простая перезагрузка может решить проблему. Вы можете перезапустить оболочку Python или свое устройство. Если проблема не исчезнет, я рекомендую переустановить python.
0
AYIBO ROBERTS
4 Авг 2020 в 00:52