File size: 3,982 Bytes
026d1b5 a30aa2c 026d1b5 a30aa2c 026d1b5 93fffe5 026d1b5 93fffe5 026d1b5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import os
import shutil
import subprocess
import sys
def main():
project_dir = os.path.dirname(os.path.abspath(__file__))
temp_dir = os.path.join(project_dir, "temp_basicsr")
python_exe = sys.executable
# 0. Check if a local base64 encoded wheel exists in tools/
import glob
import base64
b64_files = glob.glob(os.path.join(project_dir, "basicsr-*.whl.b64"))
if b64_files:
b64_path = b64_files[0]
whl_path = b64_path.replace(".b64", "")
print(f"Found base64 encoded wheel at {b64_path}. Decoding to {whl_path}...")
try:
with open(b64_path, "rb") as f_in:
decoded_data = base64.b64decode(f_in.read())
with open(whl_path, "wb") as f_out:
f_out.write(decoded_data)
print(f"Installing BasicSR from decoded wheel {whl_path}...")
subprocess.run([python_exe, "-m", "pip", "install", whl_path], check=True)
print("BasicSR installed successfully from decoded wheel!")
# Clean up decoded wheel
if os.path.exists(whl_path):
os.remove(whl_path)
return
except Exception as e:
print(f"Failed to install from base64 wheel: {e}. Falling back to git clone...")
if os.path.exists(whl_path):
os.remove(whl_path)
# 1. Clean up existing temp directory if it exists
if os.path.exists(temp_dir):
print(f"Cleaning up existing {temp_dir}...")
shutil.rmtree(temp_dir, ignore_errors=True)
# 2. Clone BasicSR repository
print("Cloning BasicSR repository...")
subprocess.run(["git", "clone", "--depth", "1", "https://github.com/xinntao/BasicSR.git", temp_dir], check=True)
# 3. Patch setup.py
setup_py_path = os.path.join(temp_dir, "setup.py")
print(f"Patching {setup_py_path}...")
with open(setup_py_path, "r", encoding="utf-8") as f:
content = f.read()
# Replace the locals() access in get_version()
old_func = """def get_version():
with open(version_file, 'r') as f:
exec(compile(f.read(), version_file, 'exec'))
return locals()['__version__']"""
new_func = """def get_version():
with open(version_file, 'r') as f:
g = {}
exec(compile(f.read(), version_file, 'exec'), g)
return g['__version__']"""
if old_func in content:
content = content.replace(old_func, new_func)
else:
# Alternative search in case spacing is slightly different
target = "return locals()['__version__']"
replacement = "g = {}; exec(compile(open(version_file).read(), version_file, 'exec'), g); return g['__version__']"
# We find get_version and patch it
content = content.replace(target, "g = {}; exec(compile(open(version_file).read(), version_file, 'exec'), g); return g['__version__']")
with open(setup_py_path, "w", encoding="utf-8") as f:
f.write(content)
# 4. Install using the current python executable's pip
python_exe = sys.executable
print(f"Installing BasicSR using {python_exe}...")
# We set BASICSR_EXT=True to compile if needed, or leave it default
# BasicSR by default tries to compile CUDA extensions. To prevent build failures on systems without CUDA compiler,
# we can disable building extensions by not setting BASICSR_EXT=True or explicitly setting BASICSR_EXT=False if needed.
# Usually, leaving it default installs the pure Python code + basic setup.
env = os.environ.copy()
env["BASICSR_EXT"] = "False" # Force pure Python installation to avoid needing a C++ compiler
subprocess.run([python_exe, "-m", "pip", "install", temp_dir], env=env, check=True)
# 5. Clean up
print("Cleaning up temp directory...")
shutil.rmtree(temp_dir, ignore_errors=True)
print("BasicSR installed successfully!")
if __name__ == "__main__":
main()
|