Ошибка сокета Python Flask Socket (новая для среды Linux)

Это, скорее всего, быстрое решение, но я зашел в тупик, и надеюсь, вы сможете помочь. Пожалуйста, не стесняйтесь, я не владею средой командной строки.

Я только начинаю с использования инфраструктуры Python под названием Flask. Он был успешно установлен, и я встал и запустил Hello World. Консоль отправляла мне журналы, когда я вызывал программу в браузере.

Чтобы выйти из журналов консоли, я нажал ctrl-z (^ Z) ~~ вероятно, где начинается ошибка? ~~ и было предложено:

[1]+ Stopped python hello.py

Теперь, когда я либо: а) попытаюсь запустить программу в браузере, либо b) запустите script в командной строке python hello.py im, вызвав ошибку:

socket.error: [Errno 48] Address already in use

.. и, конечно, много других строк, напечатанных на консоли.

Хороший ответ должен включать то, что я сделал не так, и что я могу сделать, чтобы исправить это, и принятый ответ также будет включать в себя почему;)

3 ответа

Вы правильно догадались, Ctrl - Z - это то, что вызвало у вас неприятности. Ваша проблема в том, что Ctrl - Z фактически оставляет приложение приостановленным, а не завершенным. Чтобы завершить программу, вы хотите Ctrl - C.

Ваша программа использует сокет, который он настроен для использования. Попытка перезапустить программу приводит к тому, что новый экземпляр Python пытается использовать сокет, который вы настроили для использования программы, - который удерживается остановленной программой.

У вас есть несколько вариантов отсюда:

  • В оболочке с остановленным экземпляром Python вы можете ввести %1 или fg 1, чтобы вернуться к запуску экземпляра Python, который вы остановили, и иметь то, что отображается на вашем терминале.
    • После выполнения выше вы можете ввести Ctrl - C и закончить экземпляр Python, который у вас запущен, что делает сокет доступным для нового экземпляра Python.
  • В этой же оболочке вы можете ввести bg 1, что приведет к тому, что экземпляр Python будет запущен в фоновом режиме, а не будет отображаться на терминале. Затем приложение должно стать отзывчивым. В любой момент вы можете ввести fg 1 в эту командную строку, чтобы он снова отображался на терминале.

Существуют и другие доступные опции, в том числе с помощью ps, чтобы найти идентификатор процесса вашего экземпляра Python, а затем с помощью kill отправить сигналы этому процессу, если вы не можете найти командную строку, из которой она запущена.

Страницы руководства для оболочки должны помочь вам в управлении заданиями. Вы можете использовать команду man, чтобы прочитать руководство. Введите man bash, чтобы прочитать руководство bash. Если вы работаете с какой-либо другой оболочкой, вы можете просто вызвать man с этим именем оболочки.


Что вы делали, когда вы нажимали CTRL + Z, так это то, что вы остановили свою программу и застряли в фоновом режиме.

Он отключен от вашего терминала. Теперь, если вы наберете fg 1, вы вернете его. Тем временем программа сидит в памяти, со всеми ее IO и такими связанными. Таким образом, вы не можете запустить программу еще раз. Но поскольку он остановился и не работает через процессор, вы также не можете использовать веб-часть. Если вы хотите избежать вывода терминала, перенаправляйте его к файлу (python hello.py > hello.log) или /dev/null, если вы не хотите видеть результат (python hello.py > /dev/null).


Я не понимаю, как вводить fg1 в моей среде Linux, но, по крайней мере, я могу рассказать вам, как это сделать правильно. Я долго держался на Ctrl + Z и думал, что API не работает... Вот мой способ сделать это, надеюсь, что это поможет.

Введите sudo python xxx.py. Он будет запускать ваш API. В запросе будет указан ваш пароль (из-за sudo), и как только вы введете правильный пароль, окна скажут примерно следующее.

Bottle server starting up...
Listening on http://0.0.0.0:port_number/
Hit Ctrl-C to quit.

Если вы хотите выйти из этого диалога, не закрывая API, введите Ctrl + a, затем d. Поэтому нажмите клавиши Ctrl + a (ничего не перекачивается), затем отпустите их и нажмите d. Это отменит привязку экрана и вернет вас к обычной командной строке.

licensed under cc by-sa 3.0 with attribution.