Fixes #5077 ## Summary Previously, in a powershell on windows when using `python -m ruff` instead of `ruff` a call such as `python -m ruff "a b.py"` would fail because the space would be split into two arguments. The python docs [recommend](https://docs.python.org/3/library/os.html#os.spawnv) using subprocess instead of os.spawn variants, which does fix the problem. ## Test Plan I manually confirmed that the problem previously occurred and now doesn't anymore. This only happens in a very specific environment (maturin build, windows, powershell), so i could try adding a step on CI for it but i don't think it's worth it. ``` (.venv) PS C:\Users\Konstantin\PycharmProjects\ruff> python -m ruff "a b.py" warning: Detected debug build without --no-cache. error: Failed to lint a: The system cannot find the file specified. (os error 2) error: Failed to lint b.py: The system cannot find the file specified. (os error 2) a:1:1: E902 The system cannot find the file specified. (os error 2) b.py:1:1: E902 The system cannot find the file specified. (os error 2) Found 2 errors. (.venv) PS C:\Users\Konstantin\PycharmProjects\ruff> python -m ruff "a b.py" warning: Detected debug build without --no-cache. a b.py:2:5: F841 [*] Local variable `x` is assigned to but never used Found 1 error. [*] 1 potentially fixable with the --fix option. ```
37 lines
926 B
Python
37 lines
926 B
Python
import os
|
|
import subprocess
|
|
import sys
|
|
import sysconfig
|
|
from pathlib import Path
|
|
|
|
|
|
def find_ruff_bin() -> Path:
|
|
"""Return the ruff binary path."""
|
|
|
|
ruff_exe = "ruff" + sysconfig.get_config_var("EXE")
|
|
|
|
path = Path(sysconfig.get_path("scripts")) / ruff_exe
|
|
if path.is_file():
|
|
return path
|
|
|
|
if sys.version_info >= (3, 10):
|
|
user_scheme = sysconfig.get_preferred_scheme("user")
|
|
elif os.name == "nt":
|
|
user_scheme = "nt_user"
|
|
elif sys.platform == "darwin" and sys._framework:
|
|
user_scheme = "osx_framework_user"
|
|
else:
|
|
user_scheme = "posix_user"
|
|
|
|
path = Path(sysconfig.get_path("scripts", scheme=user_scheme)) / ruff_exe
|
|
if path.is_file():
|
|
return path
|
|
|
|
raise FileNotFoundError(path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ruff = find_ruff_bin()
|
|
completed_process = subprocess.run([ruff, *sys.argv[1:]])
|
|
sys.exit(completed_process.returncode)
|