#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
шаге.