From 17d35ea423fcbfab2caf87dc4a8323d3b7d231fa Mon Sep 17 00:00:00 2001 From: torzdf <36920800+torzdf@users.noreply.github.com> Date: Mon, 16 May 2022 11:28:09 +0100 Subject: [PATCH] setup.py - python 3.9 support - move requirements files to dedicated folder - update all references to requirements files locations - setup.py: remove git requirements references - setup.py: allow running in python 3.9 - windows/linux installers: default to python 3.9 environment - faceswap.py: cleaner python version check --- .gitignore | 6 +++- .install/linux/faceswap_setup_x64.sh | 3 +- .install/windows/install.nsi | 2 +- Dockerfile.cpu | 2 +- Dockerfile.gpu | 4 +-- INSTALL.md | 10 +++--- faceswap.py | 4 +-- .../_requirements_base.txt | 0 .../conda-environment-apple-silicon.yml | 0 .../requirements_amd.txt | 0 .../requirements_cpu.txt | 0 .../requirements_nvidia.txt | 0 setup.py | 34 ++++++++----------- 13 files changed, 31 insertions(+), 34 deletions(-) rename _requirements_base.txt => requirements/_requirements_base.txt (100%) rename conda-environment-apple-silicon.yml => requirements/conda-environment-apple-silicon.yml (100%) rename requirements_amd.txt => requirements/requirements_amd.txt (100%) rename requirements_cpu.txt => requirements/requirements_cpu.txt (100%) rename requirements_nvidia.txt => requirements/requirements_nvidia.txt (100%) diff --git a/.gitignore b/.gitignore index 0f3faf7..580d05d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,14 @@ !*.keep !*.md +# Requirements files +!/requirements/ +!/requirements/*requirements*.txt +!/requirements/*conda*.yml + # Root files !Dockerfile* !.pylintrc -!*requirements*.txt !setup.cfg !.travis.yml !/faceswap.py diff --git a/.install/linux/faceswap_setup_x64.sh b/.install/linux/faceswap_setup_x64.sh index 3d861c6..4d6a1da 100644 --- a/.install/linux/faceswap_setup_x64.sh +++ b/.install/linux/faceswap_setup_x64.sh @@ -12,6 +12,7 @@ DIR_CONDA="$HOME/miniconda3" CONDA_EXECUTABLE="${DIR_CONDA}/bin/conda" CONDA_TO_PATH=false ENV_NAME="faceswap" +PYENV_VERSION="3.9" DIR_FACESWAP="$HOME/faceswap" VERSION="nvidia" @@ -348,7 +349,7 @@ create_env() { # Create Python 3.8 env for faceswap delete_env info "Creating Conda Virtual Environment..." - yellow ; "$CONDA_EXECUTABLE" create -n "$ENV_NAME" -q python=3.8 -y + yellow ; "$CONDA_EXECUTABLE" create -n "$ENV_NAME" -q python="$PYENV_VERSION" -y } diff --git a/.install/windows/install.nsi b/.install/windows/install.nsi index e2d2bdd..7e9a0d1 100644 --- a/.install/windows/install.nsi +++ b/.install/windows/install.nsi @@ -22,7 +22,7 @@ InstallDir $PROFILE\faceswap # Install cli flags !define flagsConda "/S /RegisterPython=0 /AddToPath=0 /D=$PROFILE\MiniConda3" !define flagsRepo "--depth 1 --no-single-branch ${wwwRepo}" -!define flagsEnv "-y python=3.8" +!define flagsEnv "-y python=3.9" # Folders Var ProgramData diff --git a/Dockerfile.cpu b/Dockerfile.cpu index 45eeeaf..ce7a0b4 100755 --- a/Dockerfile.cpu +++ b/Dockerfile.cpu @@ -11,7 +11,7 @@ RUN apt-get update -qq -y \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY _requirements_base.txt /opt/ +COPY ./requirements/_requirements_base.txt /opt/ RUN pip3 install --upgrade pip RUN pip3 --no-cache-dir install -r /opt/_requirements_base.txt && rm /opt/_requirements_base.txt diff --git a/Dockerfile.gpu b/Dockerfile.gpu index 951e753..c7dd1f6 100755 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -15,8 +15,8 @@ RUN rm get-pip.py # install requirements RUN apt-get install ffmpeg git -y -COPY _requirements_base.txt /opt/ -COPY requirements_nvidia.txt /opt/ +COPY ./requirements/_requirements_base.txt /opt/ +COPY ./requirements/requirements_nvidia.txt /opt/ RUN python3.8 -m pip --no-cache-dir install -r /opt/requirements_nvidia.txt && rm /opt/_requirements_base.txt && rm /opt/requirements_nvidia.txt RUN python3.8 -m pip install jupyter matplotlib diff --git a/INSTALL.md b/INSTALL.md index 3857340..5c82cba 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -120,9 +120,9 @@ Do not follow these steps if the Easy Install above completed succesfully. If you are using an Nvidia card make sure you have the correct versions of Cuda/cuDNN installed for the required version of Tensorflow - Install tkinter (required for the GUI) by typing: `conda install tk` - Install requirements: - - For Nvidia GPU users: `pip install -r requirements_nvidia.txt` - - For AMD GPU users: `pip install -r requirements_amd.txt` - - For CPU users: `pip install -r requirements_cpu.txt` + - For Nvidia GPU users: `pip install -r ./requirements/requirements_nvidia.txt` + - For AMD GPU users: `pip install -r ./requirements/requirements_amd.txt` + - For CPU users: `pip install -r ./requirements/requirements_cpu.txt` ## Running faceswap - If you are not already in your virtual environment follow [these steps](#entering-your-virtual-environment) @@ -176,7 +176,7 @@ $ source ~/miniforge3/bin/activate #### Easy install ```sh $ conda deactivate -$ conda env create -f conda-environment-apple-silicon.yml +$ conda env create -f ./requirements/conda-environment-apple-silicon.yml $ conda activate faceswap ``` - Enter the command `python faceswap.py gui` and follow the prompts: @@ -219,7 +219,7 @@ Enter your virtual environment and then enter the folder that faceswap has been ```bash python setup.py ``` -If setup fails for any reason you can still manually install the packages listed within requirements.txt +If setup fails for any reason you can still manually install the packages listed within the files in the requirements folder. ### About some of the options - CUDA: For acceleration. Requires a good nVidia Graphics Card (which supports CUDA inside) diff --git a/faceswap.py b/faceswap.py index 95e53a1..4e010b9 100755 --- a/faceswap.py +++ b/faceswap.py @@ -12,9 +12,7 @@ _LANG = gettext.translation("faceswap", localedir="locales", fallback=True) _ = _LANG.gettext -if sys.version_info[0] < 3: - raise Exception("This program requires at least python3.7") -if sys.version_info[0] == 3 and sys.version_info[1] < 7: +if sys.version_info < (3, 7): raise Exception("This program requires at least python3.7") diff --git a/_requirements_base.txt b/requirements/_requirements_base.txt similarity index 100% rename from _requirements_base.txt rename to requirements/_requirements_base.txt diff --git a/conda-environment-apple-silicon.yml b/requirements/conda-environment-apple-silicon.yml similarity index 100% rename from conda-environment-apple-silicon.yml rename to requirements/conda-environment-apple-silicon.yml diff --git a/requirements_amd.txt b/requirements/requirements_amd.txt similarity index 100% rename from requirements_amd.txt rename to requirements/requirements_amd.txt diff --git a/requirements_cpu.txt b/requirements/requirements_cpu.txt similarity index 100% rename from requirements_cpu.txt rename to requirements/requirements_cpu.txt diff --git a/requirements_nvidia.txt b/requirements/requirements_nvidia.txt similarity index 100% rename from requirements_nvidia.txt rename to requirements/requirements_nvidia.txt diff --git a/setup.py b/setup.py index 79c6697..8e8a169 100755 --- a/setup.py +++ b/setup.py @@ -126,23 +126,16 @@ class Environment(): req_files = ["_requirements_base.txt", f"requirements_{suffix}"] pypath = os.path.dirname(os.path.realpath(__file__)) requirements = [] - git_requirements = [] for req_file in req_files: - requirements_file = os.path.join(pypath, req_file) + requirements_file = os.path.join(pypath, "requirements", req_file) with open(requirements_file, encoding="utf8") as req: for package in req.readlines(): package = package.strip() - # parse_requirements can't handle git dependencies, so extract and then - # manually add to final list - if package and package.startswith("git+"): - git_requirements.append((package, [])) - continue if package and (not package.startswith(("#", "-r"))): requirements.append(package) self.required_packages = [(pkg.name, pkg.specs) for pkg in parse_requirements(requirements) if pkg.marker is None or pkg.marker.evaluate()] - self.required_packages.extend(git_requirements) def check_permission(self): """ Check for Admin permissions """ @@ -166,10 +159,12 @@ class Environment(): def check_python(self): """ Check python and virtual environment status """ self.output.info(f"Installed Python: {self.py_version[0]} {self.py_version[1]}") - if not (self.py_version[0].split(".")[0] == "3" - and self.py_version[0].split(".")[1] in ("7", "8") - and self.py_version[1] == "64bit") and not self.updater: - self.output.error("Please run this script with Python version 3.7 or 3.8 " + + if self.updater: + return + + if not ((3, 7) <= sys.version_info < (3, 10) and self.py_version[1] == "64bit"): + self.output.error("Please run this script with Python version 3.7 to 3.9 " "64bit and try again.") sys.exit(1) @@ -209,7 +204,7 @@ class Environment(): def get_installed_packages(self): """ Get currently installed packages """ installed_packages = {} - with Popen(f"\"{sys.executable}\" -m pip freeze", shell=True, stdout=PIPE) as chk: + with Popen(f"\"{sys.executable}\" -m pip freeze --local", shell=True, stdout=PIPE) as chk: installed = chk.communicate()[0].decode(self.encoding).splitlines() for pkg in installed: @@ -663,18 +658,17 @@ class Install(): def check_missing_dep(self): """ Check for missing dependencies """ for key, specs in self.env.required_packages: - if self.env.is_conda: - # Get Conda alias for Key + + if self.env.is_conda: # Get Conda alias for Key key = CONDA_MAPPING.get(key, (key, None))[0] - if (key == "git+https://github.com/deepfakes/nvidia-ml-py3.git" and - self.env.installed_packages.get("nvidia-ml-py3", "") == "7.352.1"): - # Annoying explicit hack to get around our custom version of nvidia-ml=py3 being - # constantly re-downloaded - continue + if key not in self.env.installed_packages: + # Add not installed packages to missing packages list self.env.missing_packages.append((key, specs)) continue + installed_vers = self.env.installed_packages.get(key, "") + if specs and not all(self._operators[spec[0]](installed_vers, spec[1]) for spec in specs): self.env.missing_packages.append((key, specs))