bazel-contrib / bazel-contrib/rules_python

pipy dependency generated py_library ignores .pyc files in installed package.

Offen
#2,178 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Can Close? help wanted
Vorherrschende Sprache
Starlark
Sterne
688
Forks
721
Ø Merge
15 Std. 7 Min.
Gemergte PRs (30 T.)
76

Beschreibung

# 🐞 bug report

### Affected Rule

https://github.com/bazelbuild/rules_python/blob/main/docs/pypi-dependencies.md
Specifically `py_library` with `name = "pkg"` generated by
```
pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
hub_name = "my_deps",
python_version = "3.11",
requirements_lock = "//:requirements_lock_3_11.txt",
)
use_repo(pip, "my_deps")
```

### Is this a regression?

I don't know.

### Description

I couldn't import a module from pip package that ships python modules with .pyi and .pyc files.
For example, I have a example_package that ships with the following file structure
```
/example_package
__init__.py
foo.pyc
foo.pyi
```
According to https://peps.python.org/pep-3147/#flow-chart,
```
import foo from example_package
```
Should be successful. But the `py_library` generated specifically excludes `"**/*.pyc"` from `data`. If I manually remove the `"**/*.pyc"` exclusion, the import statement works.
```
py_library(
name = "pkg",
srcs = glob(
["site-packages/**/*.py"],
exclude=[],
# Empty sources are allowed to support wheels that don't have any
# pure-Python code, e.g. pymssql, which is written in Cython.
allow_empty = True,
),
data = [] + glob(
["site-packages/**/*"],
exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
),
# This makes this directory a top-level in the python import
# search path for anything that depends on this.
imports = ["site-packages"],
deps = [],
tags = ["pypi_name=example_package", "pypi_version=3.21.0"],
visibility = ["//visibility:public"],
)
```

How
## 🔬 Minimal Reproduction

1. Creating a pip package following https://packaging.python.org/en/latest/ but replace the foo.py with compiled foo.pyc file.
2. Add pip dependency to a bazel workspace following guides in https://github.com/bazelbuild/rules_python/blob/main/docs/pypi-dependencies.md
3. In a py_library or py_binary, `import foo from example_package` should work but errors out with module not found error.

## 🔥 Exception or Error

```
ImportError: cannot import name 'foo' from 'example_package'
```

## 🌍 Your Environment

**Operating System:**

```
Linux
```

**Output of `bazel version`:**

  

Bazelisk version: v1.20.0
Build label: 7.0.2
Build target: @@//src/main/java/com/google/devtools/build/lib/bazel:BazelServer
Build time: Thu Jan 25 16:13:35 2024 (1706199215)
Build timestamp: 1706199215
Build timestamp as int: 1706199215

**Rules_python version:**

  

bazel_dep(name = "rules_python", version = "0.31.0")

**Anything else relevant?**

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit docs/pypi-dependencies.md und der dort gezeigten pip.parse-Konfiguration und reproduziere anschließend die generierte py_library mit einem Paket, das foo.pyc und foo.pyi enthält. Vergleiche den generierten data glob mit dem gemeldeten Paketinhalt und verifiziere, dass das Importieren von foo aus example_package unter Bazel erfolgreich ist, sobald das Problem behoben ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
build-system
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.