Câu hỏi Cython: ImportError: Không có module nào được đặt tên là 'myModule': cách gọi một mô-đun cython chứa một cimport đến một nốt sần khác?


Tôi đang cố gắng nhập khẩu một mô đun cython data.pyx vào một user.pyx mô-đun cython khác. Tất cả mọi thứ biên dịch tốt, nhưng khi tôi cố gắng gọi user.pyx trong một mô-đun python, tôi nhận được lỗi 'ImportError: No module named data'.

Mọi thứ đều nằm trong cùng thư mục.

package/
    __init__.py   #empty
    setup.py      
    data.pxd
    data.pyx
    user.pyx

Setup.py của tôi

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ext_modules = [
    Extension("data", ["data.pyx"]),
    Extension("user", ["user.pyx"],include_dirs = ['myPackageDir'])
    ]

setup(
  name = 'app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules  
)

Chạy test.py sau đây sẽ làm tăng lỗi.

import user     #this line raised the 'ImportError: No module named data' below
user.doSomething()

Ngoại lệ tôi nhận được là

Traceback:
 File "test.py", line 1, in <module>
    import package.user
  File "user.pyx", line 1, in init user (user.c:3384)
ImportError: No module named data

Làm thế nào tôi có thể thực hiện công việc nhập? Cảm ơn vì bất kì sự giúp đỡ.


13
2018-03-27 02:08


gốc


Tại sao bạn chỉnh sửa mã của mình thành mã hoạt động khi nó thực sự chứng minh mã sai? - Niklas R
@Niklas Tôi thấy quan điểm của bạn. Với chỉnh sửa của tôi, bài đăng trở nên khó hiểu. Rob đăng giải quyết lỗi 'ImportError: không có mô-đun tên người dùng'. Nhưng vấn đề thực tế của tôi là lỗi 'ImportError không có module dữ liệu', mà tôi đã giải quyết bằng cách biên dịch lại tất cả dự án của tôi. Khi bài Rob giải quyết một vấn đề tiềm năng thực sự, tôi đánh dấu nó là câu trả lời, ngay cả khi đó không phải là vấn đề thực tế của tôi. Xin lỗi vì sự nhầm lẫn. Nếu có cách nào tốt hơn, hãy cho tôi biết.


Các câu trả lời:


Tôi có thể thiếu một cái gì đó về Cython, nhưng tôi nghĩ rằng đó là:

import package.user
user.doSomething()

1
2018-03-27 03:03



Sai lầm của tôi, trong mã của tôi, tôi đã viết 'package.user' như bạn đề nghị. Nhưng tôi đã quên gõ nó khi viết câu hỏi của tôi. Tôi đã sửa chữa câu hỏi của mình.
Tôi xây dựng lại tất cả các tập tin trong dự án của tôi và nó đã sửa chữa vấn đề. Cảm ơn bạn đã giúp đỡ.
Bạn chắc chắn được chào đón, nhưng có vẻ như bạn đã tự khắc phục sự cố. Vui vì nó hoạt động! - rob


Tôi gặp lại vấn đề này trong một dự án khác. Để giải quyết nó, đây là những gì tôi đã làm:

  • tất cả các import và cimport tuyên bố phải hoàn toàn đủ điều kiện
  • tất cả mã python phải được chứa trong một rootFolder 
  • các setup.py phải ở cùng cấp với rootFolder 
  • tất cả thư mục trong rooFolder bao gồm cả rootFolder phải có một __init__.py 
  • trong của bạn setup.py phần mở rộng của include_dirs phải chứa '.' 

Tôi đã tạo ra một dự án đơn giản minh họa điều này đây.
Điều này trang đã giúp tôi tạo ra nó.
Nhưng dự án của tôi đơn giản hơn và tôi nghĩ nó sẽ giúp tôi rất nhiều nếu tôi có nó.
Dự án của tôi cũng minh họa cách tự động xây dựng tất cả các tệp cython trong một dự án.


10
2018-05-10 13:53



Có ai xảy ra để có một ví dụ Python 3 của dự án đơn giản? - Jorrick Sleijster