Почему программа на Python перезапускается каждые 2-3 секунды после сборки с помощью PyInstaller на Mac OS для архитектуры Arm?

Я столкнулся с проблемой при упаковке своей программы на Python с помощью pyinstaller. Вот мой код: 
```python
from PIL import Image
from requests import *
from urllib.request import urlopen

def main():
        keys = {'api_key': "ceNbEX2ezPD90Ruezh8g2rUtlb12sSnC6G18jzlu"}

        nasa = get('https://api.nasa.gov/planetary/apod?api_key=ceNbEX2ezPD90Ruezh8g2rUtlb12sSnC6G18jzlu')
        nlist = nasa.json()

        url = nlist['url']

        print(url)

        image = Image.open(urlopen(url))
        image.show()
        image.close()

if __name__ == '__main__':
        main()
```
Проблема заключается в том, что при сборке с параметрами --noconsole или -w, программа сначала выполняется правильно, но затем запускается снова, создавая новый процесс с другим номером. В частности, при использовании -w программа запускается дважды. Pyinstaller не выдает никаких ошибок, и я уже несколько часов ищу информацию в интернете, но так и не смог решить эту проблему.  Можете помочь разобраться, в чем дело?
  • 10 сентября 2024 г. 17:53
Ответы на вопрос 2
Проблема, с которой вы столкнулись, вероятно, связана с тем, как PyInstaller обрабатывает запуск GUI приложений и особенности работы Python на Mac OS, особенно для архитектуры ARM (Apple Silicon).

Вот несколько возможных причин и решений, чтобы устранить проблему:

### 1. Отсутствие обработки сигналов
Иногда программы, собранные с помощью PyInstaller, могут вести себя непредсказуемо, если не обработать сигналы или если они перезапускаются. В вашем коде можно попробовать добавить отладочный вывод, чтобы увидеть, что именно происходит при каждом запуске программы. Например:

```python
import os
import sys
from PIL import Image
from requests import get
from urllib.request import urlopen

def main():
    print("Запуск программы, PID:", os.getpid())
    
    keys = {'api_key': "ceNbEX2ezPD90Ruezh8g2rUtlb12sSnC6G18jzlu"}
    nasa = get('https://api.nasa.gov/planetary/apod?api_key=' + keys['api_key'])
    nlist = nasa.json()
    url = nlist['url']

    print("URL изображения:", url)

    image = Image.open(urlopen(url))
    image.show()
    image.close()

if __name__ == '__main__':
    if hasattr(sys, 'frozen'):
        print("Программа собрана в exe.")
    main()
```

### 2. Проблемы с библиотеками
Некоторые библиотеки, такие как `PIL`, могут иметь проблемы совместимости. Убедитесь, что у вас установлены последние стабильные версии всех зависимостей.

### 3. Использование флага -F или -D
При сборке приложения используйте флаг `-F` для создания одного исполняемого файла или `-D` для создания папки с файлами. Возможно, использование одного из этих флагов решит проблему.

### 4. Проверка на наличие `__import__`
Если в вашем коде присутствуют какие-то дополнительные модули или библиотеки, их статическая загрузка может вызвать перезапуск программы. Попробуйте изолировать проблемный код.

### 5. Применение альтернативных сборок
Если проблема сохраняется, попробуйте использовать `pyarmor`, `cx_Freeze` или другие инструменты, которые могут более корректно упаковать ваше приложение.

### 6. Логи и отладка
Добавьте отладочные логи на каждом этапе. Это поможет понять, что происходит, когда программа перезапускается.

### 7. Проверка совместимости
Проверьте совместимость версии PyInstaller с вашей версией Python и Mac OS. Иногда устаревшие или слишком новые версии могут вызывать проблемы.

После применения предложенных стратегий, вам должно удастся найти источник проблемы, и вы сможете предпринять дальнейшие действия для ее устранения.
на Mac OS --windowed (--noconsole ) может повторно инициализировать процесс запуска. 

Самый простой вариант
добавить проверку на __name__ == '__main__',
для предотвращения повторного запуска main()

если сработает значит оно:)
Похожие вопросы