Hello,
Lars-Dominik Braun <lars@6xq.net> writes:
Toggle quote (9 lines)
> Hi Maxim,
>
>> +if not matching_sites:
>> + exit(0)
> are you sure about using `exit()` here? sitecustomize.py is imported
> during startup and this would simply quit the Python interpreter if
> GUIX_PYTHONPATH is not set, wouldn’t it? (Can’t test the change
> unfortunately, because it’s a massive rebuild.)
You can test it by placing the new sitecustomize.py file in the current
directory, and then:
$ guix shell python-wrapper python-pdbpp
[env]$ $ PYTHONPATH=. GUIX_PYTHONPATH= python sample.py
where sample.py contains something like:
Toggle snippet (5 lines)
__import__("pdb").set_trace()
print('hello')
Indeed, when GUIX_PYTHONPATH is unset or matching_sites is empty, it
exit with 0 as you expected:
Toggle snippet (17 lines)
$ PYTHONPATH=. GUIX_PYTHONPATH= python sample.py
Fatal Python error: init_import_site: Failed to import the site module
Python runtime state: initialized
Traceback (most recent call last):
File "/gnu/store/p5fgysbcnnp8b1d91mrvjvababmczga0-python-3.9.6/lib/python3.9/site.py", line 589, in <module>
main()
File "/gnu/store/p5fgysbcnnp8b1d91mrvjvababmczga0-python-3.9.6/lib/python3.9/site.py", line 582, in main
execsitecustomize()
File "/gnu/store/p5fgysbcnnp8b1d91mrvjvababmczga0-python-3.9.6/lib/python3.9/site.py", line 521, in execsitecustomize
import sitecustomize
File "/home/maxim/proj/kinova/kts_robot/sitecustomize.py", line 52, in <module>
exit(0)
File "/gnu/store/p5fgysbcnnp8b1d91mrvjvababmczga0-python-3.9.6/lib/python3.9/_sitebuiltins.py", line 26, in __call__
raise SystemExit(code)
SystemExit: 0
After the proposed change:
Toggle snippet (5 lines)
[env]$ PYTHONPATH=. GUIX_PYTHONPATH= python sample.py
> /home/maxim/proj/kinova/kts_robot/sample.py(5)<module>()
-> print('hello')
There's no longer pdbpp because of clearing GUIX_PYTHONPATH but at least
it doesn't crash :-).
Toggle quote (14 lines)
>> +# Move the entries that were appended to sys.path in front of Python's own
>> +# site-packages directory. This enables Guix packages to override Python's
>> +# bundled packages, such as 'pip'.
>> +python_site_index = sys.path.index(python_site)
>> +new_site_start_index = sys.path.index(matching_sites[0])
>> +if python_site_index < new_site_start_index:
>> + sys.path = (sys.path[:python_site_index]
>> + + sys.path[new_site_start_index:]
>> + + sys.path[python_site_index:new_site_start_index])
> This is unrelated to the pdb issue, right? I see that it’s necessary
> right now, but as suggested in #46848 I’d prefer unbundling
> setuptools/pip from python. (I’ll send a v3 of the patchset at some
> point.)
Previously the Guix-provided paths were directly spliced at the right
location; now using 'site.addsitedir' simply appends them, which
requires manual fiddling afterward.
I agree that after it's un-bundled it shouldn't be necessary anymore, but
let's keep this change for core-updates along work on the 517
python-build-system (I'll try having a look to it after the next release
it out -- ping me otherwise).
Thank you,
Maxim
From 49f0d2a493b868b9414ea10c7a676cf8404e1bca Mon Sep 17 00:00:00 2001
* gnu/packages/aux-files/python/sitecustomize.py: Use site.addsitedirs to add
the site directories; this takes care of the .pth files. Make sure the added
items still appear before Python's own 'site-packages' directory.
---
.../aux-files/python/sitecustomize.py | 22 ++++++++++++++-----
1 file changed, 16 insertions(+), 6 deletions(-)
Toggle diff (39 lines)
diff --git a/gnu/packages/aux-files/python/sitecustomize.py b/gnu/packages/aux-files/python/sitecustomize.py
index 71e328b9ac..e2348e0356 100644
--- a/gnu/packages/aux-files/python/sitecustomize.py
+++ b/gnu/packages/aux-files/python/sitecustomize.py
@@ -18,6 +18,7 @@
# along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
import os
+import site
import sys
# Commentary:
@@ -47,9 +48,18 @@ all_sites_norm = [os.path.normpath(p) for p in all_sites_raw]
matching_sites = [p for p in all_sites_norm
if p.endswith(site_packages_prefix)]
-# Insert sites matching the current version into sys.path, right before
-# Python's own site. This way, the user can override the libraries provided
-# by Python itself.
-sys_path_absolute = [os.path.realpath(p) for p in sys.path]
-index = sys_path_absolute.index(python_site)
-sys.path[index:index] = matching_sites
+if matching_sites:
+ # Deduplicate the entries, append them to sys.path, and handle any
+ # .pth files they contain.
+ for s in matching_sites:
+ site.addsitedir(s)
+
+ # Move the entries that were appended to sys.path in front of
+ # Python's own site-packages directory. This enables Guix
+ # packages to override Python's bundled packages, such as 'pip'.
+ python_site_index = sys.path.index(python_site)
+ new_site_start_index = sys.path.index(matching_sites[0])
+ if python_site_index < new_site_start_index:
+ sys.path = (sys.path[:python_site_index]
+ + sys.path[new_site_start_index:]
+ + sys.path[python_site_index:new_site_start_index])
--
2.34.0