Я пишу сервер сокет программист:

#-*- coding:utf-8 -*-
# Author:sele

import socket

HOST = '127.0.0.1'
PORT = 65432

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break

            conn.sendall(data)

Когда я запускаю его в моей команде, появляется ошибка:

sele-MacBook-Pro: test01 ldl $ ./tests02-server.py
./tests02-server.py: строка 5: импорт: команда не найдена
;; время соединения истекло; серверы недоступны
Ошибка: текущая платформа "Дарвин 18" не соответствует ожидаемой платформе "Дарвин 16"
Ошибка: если вы обновили свою ОС, следуйте инструкциям по миграции: https://trac.macports.org/ вики / миграции
Несоответствие платформы ОС
во время выполнения
"mportinit ui_options global_options global_variations"
Ошибка: / opt / local / bin / PORT: не удалось инициализировать MacPorts, несоответствие платформы ОС
./tests02-server.py: строка 10: синтаксическая ошибка рядом с неожиданным токеном ('
./tests02-server.py: строка 10:
с socket.socket (socket.AF_INET,
socket.SOCK_STREAM) как s: '

Почему там не могу найти import?


< Сильный > ИЗМЕНИТЬ - 01

Я вставил эту строку в мою первую строку.

#! / usr / bin / env python

Когда я запускаю скрипт, появляется такая ошибка:

sele-MacBook-Pro:test01 ldl$ ./tests02-server.py 
Traceback (most recent call last):
  File "./tests02-server.py", line 11, in <module>
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
AttributeError: __exit__
aircrafts-MacBook-Pro:test01 ldl$ ./tests02-server.py 
Traceback (most recent call last):
  File "./tests02-server.py", line 11, in <module>
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
AttributeError: __exit__
2
user7693832 13 Апр 2019 в 05:45

2 ответа

Лучший ответ

Вы запускаете свою программу как скрипт оболочки, а не как программу на python. Добавьте соответствующую строку #!:

#!/usr/bin/env python 

В начало вашей программы или запустите ее явно из командной строки:

$ python tests02-server.py
1
Carl Norum 13 Апр 2019 в 02:50

Ответ на ваш новый вопрос заключается в том, что вы не можете использовать socket.socket(socket.AF_INET, socket.SOCK_STREAM) с with. Чтобы оператор with мог очистить ресурс, с которым он работает, объект этого ресурса должен иметь метод __exit__. То, что возвращает socket.socket(socket.AF_INET, socket.SOCK_STREAM), очевидно, не имеет метода __exit__ для вызова with, поэтому эта ошибка.

0
Steve 13 Апр 2019 в 03:09