J'ai une extension cython dans un paquet qui est structuré comme ceci:Get SystemError: Module parent « » non chargé, ne peut pas effectuer l'importation relatif lorsque vous essayez d'importer numpy dans une extension Cython
packagename
├── MANIFEST.in
├── packagename
│ ├── __init__.py
│ ├── packagename.py
│ ├── subpackage1
│ │ ├── __init__.py
│ │ ├── subpackage1.py
│ │ └── cythonExt1.pyx
│ ├── subpackage2
│ │ ├── __init__.py
│ │ ├── subpackage2.py
│ │ └── cythonExt2.pyx
│ └── VERSION
├── requirements.txt
└── setup.py
Lorsque je tente d'ajouter une ligne à cythonExt2.pyx dont les importations numpy je reçois l'erreur suivante:
-------------------------------------------------------------
SystemError Traceback (most recent call last)
<ipython-input-5-5c4ef4d8efd3> in <module>()
1 # Calling Functions of Interest
----> 2 import pacakge.subpackage2 as thingy
3 import numpy as np
4 import matplotlib.pyplot as plt
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/pacakage-0.0.3-py3.5-linux-x86_64.egg/package/__init__.py in <module>()
18
19 # the following line imports all the functions from package.py
---> 20 from .package import *
21 import package.subpackage1
22 import package.subpackage2
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/package.py in <module>()
1 from package.subpackage1 import thingy1
----> 2 from package.subpackage2 import thingy2
3 import numpy as _np
4 from multiprocessing import Pool as _Pool
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/subpackage2.py in <module>()
3 import os
----> 4 from cythonExt2 import solve as solve_cython
5 from frange import frange
6
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/cythonExt2.pyx in init package.subpackge2.cythonExt2 (package/subpackage2/cythonExt2.c:6158)()
1 cimport numpy
----> 2 import numpy
3 cimport cython
4
5 def get_z_n(n, z):
SystemError: Parent module '' not loaded, cannot perform relative import
Si je viens CIMPORT numpy cela fonctionne et j'ai accès à l'API numpy C, mais je ne peux pas importer les fonctions de python numpy que je besoin de résoudre un problème particulier.
Pourquoi est-ce et comment puis-je le réparer?
Je me demande s'il y a un problème avec mon fichier d'installation qui ne fonctionne pas. Les parties cython de mon fichier setup.py sont comme ceci:
from setuptools import setup
from setuptools.extension import Extension
from Cython.Build import cythonize
from Cython.Build import build_ext
extensions = [Extension(
name="cythonExt1",
sources=["package/subpackage1/cythonExt1.pyx"],
include_dirs=[numpy.get_include()],
),
Extension(
name="cythonExt2",
sources=["package/subpackage2/cythonExt2.pyx"],
include_dirs=[numpy.get_include()],
)
]
setup(name='package',
...
include_package_data=True,
packages=['package',
'package.subpackage1',
'package.subpackage2',
],
ext_modules = cythonize(extensions),
install_requires=requirements,
)
On dirait que votre ligne "20" est en faute. Un point peut apparaître seulement entre deux noms réels, pas au début. Supprimez simplement le point et ajoutez le répertoire parent à PYTHONPATH. – guidot
C'est étrange car le code fonctionne bien sans la ligne d'importation numpy dans le fichier cythonExt2.pyx, je le fais aussi dans quelques autres paquets que j'ai écrits et cela fonctionne très bien dans ceux-ci. Je vais essayer de le changer et de voir si cela résout mon problème. – SomeRandomPhysicist
Je fais cette ligne afin d'importer le contenu du répertoire package.py de sorte que lorsque j'importe le paquet en python, je puisse faire le paquetage.function. Quand j'ajoute le répertoire au chemin et que j'importe le paquet j'obtiens juste un package.package.package.package récursif sans aucune fonction importée. – SomeRandomPhysicist