Как я могу правильно установить и запустить pip в версии python с эмуляцией wine (внутри контейнера docker)?

#python #docker #pip #wine

#python #docker #pip #вино

Вопрос:

Я хотел создать среду MetaTrader5 с помощью Python. Хотя я мог бы сделать это на своем компьютере с Windows, я хотел бы использовать его как отдельный контейнер Docker, скажем, для развертывания на моем компьютере (у меня есть две другие системы, которые я предпочитаю для кодирования: mac и linux) или, возможно, AWS ECR.

Для этой цели я создал этот файл docker:

 FROM ubuntu:20.04

# In order to use the python version, we'll have to install
# wine emulator. We're installing both 32 and 64 bits API.
RUN dpkg --add-architecture i386
RUN apt update
ENV TZ=UTC
RUN apt-get install --assume-yes apt-utils
RUN DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes tzdata
RUN apt-get install --assume-yes wine64 wine32

# The root wine prefix will be: /root/.wine.

# Now MetaTrader5 is being moved to the Program Files directory.
COPY ["MetaTrader5", "/root/.wine/drive_c/Program Files/MetaTrader5"]

# Also the Python interpreter is moved to that directory.
ADD ["python-3.9.0", "/root/.wine/drive_c/Program Files/python-3.9.0"]

# And the get-pip script is added to the standard interpreter.
ADD ["https://bootstrap.pypa.io/get-pip.py", "/root/.wine/drive_c/Program Files/python-3.9.0/get-pip.py"]

# The server script itself is then added as another application.
RUN ["mkdir", "-p", "/root/.wine/drive_c/Program Files/MetaTrader5 AI Server"]
COPY ["server.py", "/root/.wine/drive_c/Program Files/MetaTrader5 AI Server/server.py"]

############### 'Till this point, everything is fine.

# Now, pip will be installed for windows.
RUN ["wine", "/root/.wine/drive_c/Program Files/python-3.9.0/pythonw.exe", "/root/.wine/drive_c/Program Files/python-3.9.0/get-pip.py"]

# And then, metatrader will be installed, along with aiohttp
# library for websockets.
# RUN pip install MetaTrader5 aiohttp

# Choosing this tail command is just for debug
# purposes, as the true implementation will use
# the server.py file as entry point.
CMD ["tail", "-f", "/dev/null"]
  

Проблема, с которой я сталкиваюсь, связана с последней частью: при get-pip.py выполнении Scripts/ directory ( /root/.wine/drive_c/Program Files/python-3.9.0/Scripts ) создается с pip.exe easy_install.exe исполняемыми файлами и, но при попытке вызвать любой из них возникает ошибка, поскольку модуль pip python, похоже, не установлен.

Это можно проверить, запустив этот файл dockerfile:

 $ docker build . --tag=mt5pyserver
$ docker run --name=prueba -it mt5pyserver bash
  

И затем:

 root@a169a4c4aae8:~# cd ".wine/drive_c/Program Files/python-3.9.0"
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# wine python.exe get-pip.py 
Collecting pip
  Using cached pip-20.2.3-py2.py3-none-any.whl (1.5 MB)
Collecting setuptools
  Using cached setuptools-50.3.0-py3-none-any.whl (785 kB)
Collecting wheel
  Using cached wheel-0.35.1-py2.py3-none-any.whl (33 kB)
Installing collected packages: pip, setuptools, wheel
  WARNING: The scripts pip.exe, pip3.9.exe and pip3.exe are installed in 'C:Program Filespython-3.9.0Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts easy_install-3.9.exe and easy_install.exe are installed in 'C:Program Filespython-3.9.0Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script wheel.exe is installed in 'C:Program Filespython-3.9.0Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-20.2.3 setuptools-50.3.0 wheel-0.35.1
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# pip
bash: pip: command not found
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# wine Scripts/pip.exe
Traceback (most recent call last):
  File "runpy.py", line 197, in _run_module_as_main
  File "runpy.py", line 87, in _run_code
  File "C:Program Filespython-3.9.0Scriptspip.exe__main__.py", line 4, in <module>
ModuleNotFoundError: No module named 'pip'
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# wine --version
wine-5.0 (Ubuntu 5.0-3ubuntu1)
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# 
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# wine Scripts/pip.exe
Traceback (most recent call last):
  File "runpy.py", line 197, in _run_module_as_main
  File "runpy.py", line 87, in _run_code
  File "C:Program Filespython-3.9.0Scriptspip.exe__main__.py", line 4, in <module>
ModuleNotFoundError: No module named 'pip'
root@a169a4c4aae8:~/.wine/drive_c/Program Files/python-3.9.0# 
  

Что мне нужно, так это правильно установить pip в интерпретаторе python в Windows. Существует основная причина: пакет MetaTrader5 существует только для версий Windows python. В конце концов, я хотел бы установить этот пакет, а также aiohttp. Затем сервер будет использовать эти пакеты, как описано в документации MetaTrader5 для интеграции с Python, и немного магии самостоятельно.

Что я могу сделать, чтобы избежать получения этой ошибки?

Ответ №1:

Взгляните на это Dockerfile . Это может дать вам некоторое представление. Используемый подход совершенно другой.

Некоторые примечательные различия между этим Dockerfile и вашей настройкой:

  • Используйте wine из репозитория пакетов WineHQ, а не Ubuntu.
  • Загрузите msi установочные файлы python с python.org и установите их с помощью wine msiexec .

Вот исключение из Dockerfile :

 ...
...

ARG PYINSTALLER_VERSION=4.0

...
...

RUN set -x 
    amp;amp; for msifile in `echo core dev exe lib path pip tcltk tools`; do 
        wget -nv "https://www.python.org/ftp/python/$PYTHON_VERSION/amd64/${msifile}.msi"; 
        wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/Python37; 
        rm ${msifile}.msi; 
    done 
    amp;amp; cd /wine/drive_c/Python37 
    amp;amp; echo 'wine '''C:Python37python.exe''' "$@"' > /usr/bin/python 
    amp;amp; echo 'wine '''C:Python37Scriptseasy_install.exe''' "$@"' > /usr/bin/easy_install 
    amp;amp; echo 'wine '''C:Python37Scriptspip.exe''' "$@"' > /usr/bin/pip 
    amp;amp; echo 'wine '''C:Python37Scriptspyinstaller.exe''' "$@"' > /usr/bin/pyinstaller 
    amp;amp; echo 'wine '''C:Python37Scriptspyupdater.exe''' "$@"' > /usr/bin/pyupdater 
    amp;amp; echo 'assoc .py=PythonScript' | wine cmd 
    amp;amp; echo 'ftype PythonScript=c:Python37python.exe "%1" %*' | wine cmd 
    amp;amp; while pgrep wineserver >/dev/null; do echo "Waiting for wineserver"; sleep 1; done 
    amp;amp; chmod  x /usr/bin/python /usr/bin/easy_install /usr/bin/pip /usr/bin/pyinstaller /usr/bin/pyupdater 
    amp;amp; (pip install -U pip || true) 
    amp;amp; rm -rf /tmp/.wine-*

ENV W_DRIVE_C=/wine/drive_c
ENV W_WINDIR_UNIX="$W_DRIVE_C/windows"
ENV W_SYSTEM64_DLLS="$W_WINDIR_UNIX/system32"
ENV W_TMP="$W_DRIVE_C/windows/temp/_$0"

# install Microsoft Visual C   Redistributable for Visual Studio 2015, 2017 and 2019 dll files
RUN set -x 
    amp;amp; rm -f "$W_TMP"/* 
    amp;amp; wget -P "$W_TMP" https://aka.ms/vs/16/release/vc_redist.x64.exe 
    amp;amp; cabextract -q --directory="$W_TMP" "$W_TMP"/vc_redist.x64.exe 
    amp;amp; cabextract -q --directory="$W_TMP" "$W_TMP/a10" 
    amp;amp; cabextract -q --directory="$W_TMP" "$W_TMP/a11" 
    amp;amp; cd "$W_TMP" 
    amp;amp; rename 's/_/-/g' *.dll 
    amp;amp; cp "$W_TMP"/*.dll "$W_SYSTEM64_DLLS"/

# install pyinstaller
RUN /usr/bin/pip install pyinstaller==$PYINSTALLER_VERSION

...
...
  

Кроме того, почему вы должны устанавливать pip , когда Python 2> = 2.7.9 или Python 3> = 3.4 уже включены pip ?

Далее обратите внимание, что рекомендуется использовать связанные команды ( apt-get update/install ) на том же RUN шаге.