Allow execution of pyw files on Unix (#9759)

I don't see any real reason to forbid executing these in a
cross-platform way

```
❯ echo "print('hello world')" > test.pyw
❯ uv run test.pyw
error: Failed to spawn: `test.pyw`
  Caused by: No such file or directory (os error 2)
❯ cargo run -q -- run test.pyw
hello world
```

Closes https://github.com/astral-sh/uv/issues/9757
This commit is contained in:
Zanie Blue 2024-12-09 20:52:02 -06:00 committed by GitHub
parent 341126cf72
commit 5e5635c142
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 7 deletions

View file

@ -1173,7 +1173,7 @@ pub(crate) enum RunCommand {
/// Search `sys.path` for the named module and execute its contents as the `__main__` module.
/// Equivalent to `python -m module`.
PythonModule(OsString, Vec<OsString>),
/// Execute a `pythonw` script (Windows only).
/// Execute a `pythonw` GUI script.
PythonGuiScript(PathBuf, Vec<OsString>),
/// Execute a Python package containing a `__main__.py` file.
PythonPackage(PathBuf, Vec<OsString>),
@ -1201,7 +1201,13 @@ impl RunCommand {
| Self::PythonRemote(..)
| Self::Empty => Cow::Borrowed("python"),
Self::PythonModule(..) => Cow::Borrowed("python -m"),
Self::PythonGuiScript(..) => Cow::Borrowed("pythonw"),
Self::PythonGuiScript(..) => {
if cfg!(windows) {
Cow::Borrowed("pythonw")
} else {
Cow::Borrowed("python")
}
}
Self::PythonStdin(_) => Cow::Borrowed("python -c"),
Self::External(executable, _) => executable.to_string_lossy(),
}
@ -1413,10 +1419,9 @@ impl RunCommand {
&& is_file
{
Ok(Self::PythonScript(target_path, args.to_vec()))
} else if cfg!(windows)
&& target_path
.extension()
.is_some_and(|ext| ext.eq_ignore_ascii_case("pyw"))
} else if target_path
.extension()
.is_some_and(|ext| ext.eq_ignore_ascii_case("pyw"))
&& is_file
{
Ok(Self::PythonGuiScript(target_path, args.to_vec()))

View file

@ -542,7 +542,6 @@ fn run_pep723_script_requires_python() -> Result<()> {
/// Run a `.pyw` script. The script should be executed with `pythonw.exe`.
#[test]
#[cfg(windows)]
fn run_pythonw_script() -> Result<()> {
let context = TestContext::new("3.12");