2014-10-20 4 views
3

numpy와의 통합을 위해 updating a quaternions package이되었으므로 파이썬 2와 파이썬 3 모두에서 사용할 수 있습니다. 불행하게도 기본 가져 오기 단계는 3으로 비참하게 실패합니다. x, 파이썬 2.7에서는 결코 실패한 적이 없다. (나는 python2.7을 사용하여 2.7 버전을 컴파일하고 python3.x를 사용하여 3.x 버전을 컴파일한다. 이것은 매우 간단한 distutils이다.) 오류 메시지는 Google 결과에 나타나지 않으며, 전혀 모른다. 여기에서 어디로 가야합니까? 여기 파이썬 3에서 가져 오기가 str/bytes로 인수에 대해 불평합니다.

패키지 가져올 수있는 간단한 시도에서 전체 출력 : 오류 메시지가 적혀

> python -c 'import quaternion' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/Users/mynamehere/.continuum/anaconda/envs/py3k/lib/python3.4/site-packages/quaternion/__init__.py", line 3, in <module> 
    from .numpy_quaternion import quaternion 
TypeError: __import__() argument 1 must be str, not bytes 

을,이

from .numpy_quaternion import quaternion 

__init__.py에서 선이다 그러나 이유는해야한다 문제가 있습니까? 파일 numpy_quaternion.so__init__.py 파일과 동일한 디렉토리에 있으며 관련 기호가 포함 된 것으로 보입니다. Travis-CI은 2.7에서 잘 작동한다는 것을 보여 주지만 다른 테스트는 통과하지만 3.2와 3.4에서는 실패합니다. 따라서 파이썬 설치시 문제가있는 것은 아닙니다. 상대 가져 오기에 대해 .을 제거하려고했지만 파이썬에서 numpy_quaternion을 가져올 수 없습니다 (놀랄 일은 아닙니다). from quaternion.numpy_quaternion으로 변경하려고했지만 같은 오류가 발생합니다.

나는 there have been changes to the import system in python 3을 볼 수 있지만, 그럴 경우 다른 방법보다 py3k 호환이 될 것이라고 추측했습니다. 무슨 일있어? 어떻게 작동시킬 수 있습니까?

그냥 명확히하기 위해, 내 계층 구조는 다음과 같습니다

.../site-packages/ 
    quaternion/ 
     __init__.py 
     numpy_quaternion.so 

과 문제가있는 줄은 일반적으로 문제없이 성공하는 import numpy as np 전에 오는 유일한 방법입니다.

답변

3

python-list 사람들은 훌륭한 제안을 가지고 즉시 나에게 연락을했습니다. 내가 numpy_quaternion.so (c-api를 사용하여)을 가져오고 있지만, 그 함수에 제공 한 인수는 잘못되었다.

PyObject* numpy_str = PyString_FromString("numpy"); 
PyObject* numpy = PyImport_Import(numpy_str); 

내가

PyObject* numpy = PyImport_ImportModule("numpy"); 

그리고 JF 세바스챤 코멘트에 지적으로

를 사용하여 고정, 내가 그 때문이었다에 대한 잘못된가는 이유 : 나는 a similar package에서 코드를 사용하여 (기본적으로)이었다 PyString_FromString은 파이썬 3을 사용할 때 잘못된 함수에 대해서 단지 #define이었습니다.

+1

참고 : [Extension Modules to Python 3] (https://docs.python.org/3/howto/cporting.html) : * "C에서 Python 3의''PyString_ * '함수는 Python 2의''PyUnicode_ * ''*. 유니 코드 텍스트에는'PyString', 바이너리 데이터에는'PyBytes'를 사용하십시오. TypeError 질문에 Python 대신 Python 대신 PyBytes 사용하는 것이 좋습니다. – jfs

+0

아하! 직접적으로,하지만 * do *는'#define PyString_FromString PyBytes_FromString'을하는'npy_3kcompat.h'를 포함합니다. 그래서 그것은 나에게 잘 보였지만, 그렇지 않았습니다. 실제로'PyString_FromString'은 python3에서도 정의되어 있지 않습니다. – Mike

0

쉬운 일이기 때문에 아래에서 제 추측이 정확하다면 먼저 절대 가져 오기를 시도합니다.

게시물에서
from quaternion.numpy_quaternion import quaternion 

, 나는 당신의 계층 구조

.../Libe/site-packages 
    quaternion 
    __init__.py 
    numpy_quaternion.so 
     quaternion # a symbol in .so, not a .py 

처럼 보이는 그 quaterion 오히려 함수 또는 클래스보다, 모듈이라고 추측하고있다. 나는 'numpy_quaternion'이 바이트가되는 것을 상상할 수 없기 때문에 이것을 추측하고있다. 반면 .so는 2.7을 작동하기위한 바이트로 'quaternion'을 리턴해야하므로, 아마도 3.x와 동일하게 동작 할 것이다. 나의 유닉스 경험은 파이썬보다 우위에있다. 하지만 내 인상은 별도의 .so가 2.x 및 3.x에 필요하다는 것입니다. 그렇지 않으면 특정 컴파일 플래그가 필요할 수 있습니다. 내가 맞다면 'numpy_quaternion_3x.so'를 패키지에 추가하고 sys.version [0]에서 가져 오기를 전환해야합니다.

여기에서 더 많은 답변을 얻지 못하면 python-list를 사용해보십시오. 뉴스 그룹 미러 인 gmane.comp.python.general로 쉽게 news.gmane.com에서 액세스 할 수 있습니다. 정규 응답자는 정통한 리눅스 사용자를 포함합니다.

+0

그래, 절대 가져 오기를 시도했습니다. (필자의 글에서 언급했지만 분명히하지는 않았다.) 또한 py2.7과 py3.x를위한 별도의'lib' 디렉토리가 있으며 각각은 자신의 디렉토리를 위해 컴파일하는데 사용된다. 자신의'.so' 파일들. (py3.x는 py2.7이 있는지조차 알지 못합니다.) 파이썬리스트를 사용해 보겠습니다. 감사! – Mike