Ошибка SQLite при одновременной загрузке двух скриптов Python - PullRequest
1 голос
/ 24 сентября 2010

У меня есть два скрипта Python, которые должны запускаться одновременно, потому что они взаимодействуют друг с другом.Один скрипт - это серверный скрипт, работающий локально, а другой - клиентский скрипт, который подключается к нему через сокет.Обычно я просто открываю несколько вкладок терминала и запускаю серверный скрипт в одном, а клиент - в другом.После запуска и остановки каждого сценария снова и снова я хотел создать псевдоним bash для запуска обоих сценариев всего одной командой и придумал следующее:

gnome-terminal --tab -e "python server.py" --tab -e "python client.py"

Однако теперь сценарий сервера вызывает sqliteOperationalError говорит, что одна из моих таблиц данных не существует.Но когда я запускаю сценарии вручную, все работает нормально.Я понятия не имею, что происходит, но я подумал, что, возможно, совместное выполнение сценариев не давало сценарию сервера достаточно времени для инициализации и подключения к базе данных.Поэтому я вставил time.sleep (5) в клиентский скрипт, но как только он запускается, я получаю ту же ошибку.

У кого-нибудь есть идеи, что может происходить?Или кто-нибудь знает какие-либо альтернативы для запуска двух скриптов Python одной командой?

1 Ответ

0 голосов
/ 24 сентября 2010

Попробуйте объединить две команды в одну:

gnome-terminal --tab -x bash -c "python server.py & sleep 5; python client.py"

Я думаю, что лучше поставить команду сна (если необходимо) вне клиента, поскольку могут быть ситуации, когда сервер уже запущен и клиенту не нужно спать.


Флаг -x означает

-x, --execute
         Execute the remainder of the command line inside the terminal.

Команда вызывает bash:

bash -c "python server.py & sleep 5; python client.py"

bash, в свою очередь, имеет флаг -c, что означает

-c string If  the  -c option is present, then commands are read from string.  If
         there are arguments after the string, they are assigned to  the  posi‐
         tional parameters, starting with $0.

Возможно, вы захотите поэкспериментировать с

gnome-terminal --tab -e "python server.py & sleep 5; python client.py"

Это тоже может сработать. Когда вы сначала запускаете bash, то ваш ~ / .bashrc читается. Без вызова bash, я думаю, по умолчанию вместо этого вызывается / bin / sh.

Если вы получите

"socket.error: [Errno 98] Address already in use",

это, вероятно, означает, что ваш сервер уже запущен, и запуск сервера во второй раз завершается неудачей.

...