2017-10-20 8 views
0

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,                
) 
+0

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

+0

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

+0

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

Répondre

0

La question était que numpy n'était pas inclus correctement avec ce fichier setup.py et flux de travail. J'ai corrigé cela en le changeant pour que l'extension cython soit cytonisée dans son propre répertoire avec son propre fichier setup.py dans un fichier .c et que ce fichier soit ensuite ajouté en tant qu'extension C dans le fichier setup.py du paquet. Cela a également l'avantage que les personnes installant votre module n'ont pas besoin de Cython car vous pouvez distribuer le fichier .c généré avec le paquet.

J'ai créé cet exemple complet, mais simple, sur mon github here.