Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -151,14 +151,15 @@ def patch_asset_py():
|
|
151 |
def run_unirig_command(script_path: str, args: List[str], step_name: str):
|
152 |
"""
|
153 |
Runs a specific UniRig SHELL script (.sh) using bash in a subprocess,
|
154 |
-
ensuring the correct environment (PYTHONPATH, etc.) is set.
|
155 |
|
156 |
Args:
|
157 |
script_path: Absolute path to the .sh script to execute.
|
158 |
args: A list of command-line arguments for the script.
|
159 |
step_name: Name of the step for logging.
|
160 |
"""
|
161 |
-
|
|
|
162 |
|
163 |
print(f"\n--- Running UniRig Step: {step_name} ---")
|
164 |
print(f"Command: {' '.join(cmd)}")
|
@@ -167,7 +168,7 @@ def run_unirig_command(script_path: str, args: List[str], step_name: str):
|
|
167 |
process_env = os.environ.copy()
|
168 |
unirig_src_dir = os.path.join(UNIRIG_REPO_DIR, "src")
|
169 |
|
170 |
-
#
|
171 |
pythonpath_parts = [
|
172 |
BLENDER_PYTHON_SITE_PACKAGES,
|
173 |
unirig_src_dir,
|
@@ -176,22 +177,27 @@ def run_unirig_command(script_path: str, args: List[str], step_name: str):
|
|
176 |
process_env["PYTHONPATH"] = os.pathsep.join(filter(None, pythonpath_parts))
|
177 |
print(f"Subprocess PYTHONPATH: {process_env['PYTHONPATH']}")
|
178 |
|
179 |
-
#
|
180 |
blender_lib_path = os.path.join(BLENDER_PYTHON_DIR, "lib")
|
181 |
existing_ld_path = process_env.get('LD_LIBRARY_PATH', '')
|
182 |
process_env["LD_LIBRARY_PATH"] = f"{blender_lib_path}{os.pathsep}{existing_ld_path}" if existing_ld_path else blender_lib_path
|
183 |
print(f"Subprocess LD_LIBRARY_PATH: {process_env['LD_LIBRARY_PATH']}")
|
184 |
|
185 |
-
#
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
|
|
|
|
|
|
|
|
193 |
|
194 |
-
|
|
|
195 |
result = subprocess.run(
|
196 |
cmd,
|
197 |
cwd=UNIRIG_REPO_DIR,
|
@@ -229,9 +235,6 @@ def run_unirig_command(script_path: str, args: List[str], step_name: str):
|
|
229 |
traceback.print_exc()
|
230 |
raise gr.Error(f"Unexpected Python error during '{step_name}' execution: {str(e_general)[:500]}")
|
231 |
|
232 |
-
finally:
|
233 |
-
shutil.rmtree(temp_dir) # Clean up the temporary directory
|
234 |
-
|
235 |
print(f"--- Finished UniRig Step: {step_name} ---")
|
236 |
|
237 |
|
@@ -273,6 +276,19 @@ def rig_glb_mesh_multistep(input_glb_file_obj):
|
|
273 |
print(f"Failed to import torch in Blender's Python: {e.stderr}")
|
274 |
raise gr.Error("PyTorch import failed in Blender's Python environment. Check installation.")
|
275 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
276 |
# --- Setup Temporary Directory ---
|
277 |
processing_temp_dir = tempfile.mkdtemp(prefix="unirig_processing_")
|
278 |
print(f"Using temporary processing directory: {processing_temp_dir}")
|
|
|
151 |
def run_unirig_command(script_path: str, args: List[str], step_name: str):
|
152 |
"""
|
153 |
Runs a specific UniRig SHELL script (.sh) using bash in a subprocess,
|
154 |
+
ensuring the correct environment (PYTHONPATH, etc.) is set within Blender's context.
|
155 |
|
156 |
Args:
|
157 |
script_path: Absolute path to the .sh script to execute.
|
158 |
args: A list of command-line arguments for the script.
|
159 |
step_name: Name of the step for logging.
|
160 |
"""
|
161 |
+
# Use xvfb-run to enable headless execution of Blender
|
162 |
+
cmd = ["xvfb-run", "-a", "bash", script_path] + args
|
163 |
|
164 |
print(f"\n--- Running UniRig Step: {step_name} ---")
|
165 |
print(f"Command: {' '.join(cmd)}")
|
|
|
168 |
process_env = os.environ.copy()
|
169 |
unirig_src_dir = os.path.join(UNIRIG_REPO_DIR, "src")
|
170 |
|
171 |
+
# Set PYTHONPATH: Blender’s site-packages + UniRig source
|
172 |
pythonpath_parts = [
|
173 |
BLENDER_PYTHON_SITE_PACKAGES,
|
174 |
unirig_src_dir,
|
|
|
177 |
process_env["PYTHONPATH"] = os.pathsep.join(filter(None, pythonpath_parts))
|
178 |
print(f"Subprocess PYTHONPATH: {process_env['PYTHONPATH']}")
|
179 |
|
180 |
+
# Set LD_LIBRARY_PATH: Include Blender’s Python library directory
|
181 |
blender_lib_path = os.path.join(BLENDER_PYTHON_DIR, "lib")
|
182 |
existing_ld_path = process_env.get('LD_LIBRARY_PATH', '')
|
183 |
process_env["LD_LIBRARY_PATH"] = f"{blender_lib_path}{os.pathsep}{existing_ld_path}" if existing_ld_path else blender_lib_path
|
184 |
print(f"Subprocess LD_LIBRARY_PATH: {process_env['LD_LIBRARY_PATH']}")
|
185 |
|
186 |
+
# Set PATH to prioritize Blender's Python bin directory
|
187 |
+
existing_path = process_env.get('PATH', '')
|
188 |
+
process_env["PATH"] = f"{BLENDER_PYTHON_BIN_DIR}{os.pathsep}{existing_path}"
|
189 |
+
print(f"Subprocess PATH: {process_env['PATH']}")
|
190 |
+
|
191 |
+
# Debug: Check which Python is used
|
192 |
+
python_bin = subprocess.run(["which", "python"], env=process_env, capture_output=True, text=True)
|
193 |
+
print(f"Python binary used: {python_bin.stdout.strip()}")
|
194 |
+
|
195 |
+
# Debug: Check Blender version
|
196 |
+
blender_check = subprocess.run([os.path.join(BLENDER_INSTALL_DIR, "blender"), "--version"], capture_output=True, text=True)
|
197 |
+
print(f"Blender version: {blender_check.stdout.strip()}")
|
198 |
|
199 |
+
try:
|
200 |
+
# Execute the shell script with xvfb-run
|
201 |
result = subprocess.run(
|
202 |
cmd,
|
203 |
cwd=UNIRIG_REPO_DIR,
|
|
|
235 |
traceback.print_exc()
|
236 |
raise gr.Error(f"Unexpected Python error during '{step_name}' execution: {str(e_general)[:500]}")
|
237 |
|
|
|
|
|
|
|
238 |
print(f"--- Finished UniRig Step: {step_name} ---")
|
239 |
|
240 |
|
|
|
276 |
print(f"Failed to import torch in Blender's Python: {e.stderr}")
|
277 |
raise gr.Error("PyTorch import failed in Blender's Python environment. Check installation.")
|
278 |
|
279 |
+
# Test Blender execution
|
280 |
+
try:
|
281 |
+
blender_test = subprocess.run(
|
282 |
+
[os.path.join(BLENDER_INSTALL_DIR, "blender"), "--version"],
|
283 |
+
capture_output=True,
|
284 |
+
text=True,
|
285 |
+
check=True
|
286 |
+
)
|
287 |
+
print(f"Blender version: {blender_test.stdout.strip()}")
|
288 |
+
except subprocess.CalledProcessError as e:
|
289 |
+
print(f"Failed to run Blender: {e.stderr}")
|
290 |
+
raise gr.Error("Blender is not accessible. Check installation.")
|
291 |
+
|
292 |
# --- Setup Temporary Directory ---
|
293 |
processing_temp_dir = tempfile.mkdtemp(prefix="unirig_processing_")
|
294 |
print(f"Using temporary processing directory: {processing_temp_dir}")
|