PYTHON_SITE_PACKAGE_PATH question

33 views
Skip to first unread message

Steven A. Falco

unread,
Oct 14, 2022, 5:32:13 PM10/14/22
to kicad-developers
I've received a bug: https://bugzilla.redhat.com/show_bug.cgi?id=2134832

The basic issue is that Fedora uses both /usr/lib/python3.10 and /usr/lib64/python3.10; i.e. they separate the 32-bit and 64-bit files. The KiCad build scripts currently put _pcbnew.so into /usr/lib/python3.10, but because that file is a 64-bit shared library, it should go into /usr/lib64/python3.10 on Fedora.

I tried manually running the command that CMakeLists.txt uses to find the path:

python3 -c "import distutils.sysconfig;print(\"%s\"%distutils.sysconfig.get_python_lib(plat_specific=0, standard_lib=0, prefix=''))"

and that indeed returns:

lib/python3.10/site-packages

I could try overriding this by explicitly setting the PYTHON_SITE_PACKAGE_PATH variable, but I doubt that is the correct approach. The above command returns a deprecation warning, suggesting using sysconfig instead of distutils.sysconfig.

Here is everything that python3 has for the sysconfig.get_paths() method:

python3 -c "from sysconfig import get_paths; print(get_paths())"
{'stdlib': '/usr/lib64/python3.10', 'platstdlib': '/usr/local/lib64/python3.10', 'purelib': '/usr/local/lib/python3.10/site-packages', 'platlib': '/usr/local/lib64/python3.10/site-packages', 'include': '/usr/include/python3.10', 'platinclude': '/usr/include/python3.10', 'scripts': '/usr/local/bin', 'data': '/usr/local'}

So stdlib looks like the correct base path, although we'd have to tack on the site-packages suffix. Note that I don't think we should use platlib, because the bulk of KiCad is installed into /usr rather than /usr/local.

Please let me know what you think is the correct solution.

Steve

Steven A. Falco

unread,
Oct 15, 2022, 11:43:55 AM10/15/22
to kicad-developers
On 10/14/22 05:32 PM, Steven A. Falco wrote:
> I've received a bug: https://bugzilla.redhat.com/show_bug.cgi?id=2134832
>
> The basic issue is that Fedora uses both /usr/lib/python3.10 and /usr/lib64/python3.10; i.e. they separate the 32-bit and 64-bit files.  The KiCad build scripts currently put _pcbnew.so into /usr/lib/python3.10, but because that file is a 64-bit shared library, it should go into /usr/lib64/python3.10 on Fedora.
>
> I tried manually running the command that CMakeLists.txt uses to find the path:
>
> python3 -c "import distutils.sysconfig;print(\"%s\"%distutils.sysconfig.get_python_lib(plat_specific=0, standard_lib=0, prefix=''))"
>
> and that indeed returns:
>
> lib/python3.10/site-packages

Playing with it a bit more, if I change from "plat_specific=0" to "plat_specific=1", then I get the path Fedora wants:

$ python3 -c "import distutils.sysconfig;print(\"%s\"%distutils.sysconfig.get_python_lib(plat_specific=1, standard_lib=0, prefix=''))"
<string>:1: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
<string>:1: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead
lib64/python3.10/site-packages

But that of course does nothing to fix the deprecation warning.

> I could try overriding this by explicitly setting the PYTHON_SITE_PACKAGE_PATH variable, but I doubt that is the correct approach.  The above command returns a deprecation warning, suggesting using sysconfig instead of distutils.sysconfig.
>
> Here is everything that python3 has for the sysconfig.get_paths() method:
>
> python3 -c "from sysconfig import get_paths; print(get_paths())"
> {'stdlib': '/usr/lib64/python3.10', 'platstdlib': '/usr/local/lib64/python3.10', 'purelib': '/usr/local/lib/python3.10/site-packages', 'platlib': '/usr/local/lib64/python3.10/site-packages', 'include': '/usr/include/python3.10', 'platinclude': '/usr/include/python3.10', 'scripts': '/usr/local/bin', 'data': '/usr/local'}
>
> So stdlib looks like the correct base path, although we'd have to tack on the site-packages suffix.  Note that I don't think we should use platlib, because the bulk of KiCad is installed into /usr rather than /usr/local.

One issue with using sysconfig is that it produces an absolute path, which causes other problems.

$ python3 -c "from sysconfig import get_path; print(get_path(\"stdlib\"))"
/usr/lib64/python3.10

But it may be that I'm not using it correctly; perhaps there is a way to get it to provide a relative path, or perhaps other changes are needed on top of switching to sysconfig.
Reply all
Reply to author
Forward
0 new messages