동료가 작성한 Project A
프로젝트를 다른 Python 프로젝트에 통합하려고합니다. 이제이 동료가 자신의 코드에서 상대적으로 수입을 사용하지 않은 대신 모듈 경로가 변경된 Python 개체의 병합 해제
from packageA.moduleA import ClassA
from packageA.moduleA import ClassB
을 수행하고 그 결과
cPickle
와 클래스를 절인. 깔끔함 때문에 나는 그의 프로젝트 안에 그의 (
Project A
) 패키지를 숨기고 싶다. 그러나 이것은
packageA
에 정의 된 클래스의 경로를 변경합니다. 문제 없습니다, 그냥
from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB
를 사용하여 가져 오기하지만 지금은 클래스 이유를 분명히 모듈 인증 된 정의가 표시되지 cPickle
않습니다
with open(fname) as infile: self.clzA = cPickle.load(infile)
ImportError: No module named packageA.moduleA
그래서 다음과 같은 메시지와 함께 실패 않은 산세를 다시 정의하지 것이다. packageA
의 루트를 시스템 경로에 추가해야합니까? 이것이 문제를 해결하는 올바른 방법입니까?
cPickled
파일
ccopy_reg
_reconstructor
p1
(cpackageA.moduleA
ClassA
p2
c__builtin__
object
p3
NtRp4
오래된 프로젝트 계층 구조 같은 것이
packageA/
__init__.py
moduleA.py
moduleB.py
packageB/
__init__.py
moduleC.py
moduleD.py
가 나는 WrapperPackage
MyPackage/
.. __init__.py
.. myModuleX.py
.. myModuleY.py
WrapperPackage/
.. __init__.py
.. packageA/
.. __init__.py
.. moduleA.py
.. moduleB.py
.. packageB/
.. __init__.py
.. moduleC.py
.. moduleD.py
나는 플러그인 KRunner를 들어 서면이 문제를 건너 왔어요. Plasma에서 사용하는 스크립트 엔진은 내 코드가있는 가짜 패키지를 만들기 위해 경로 훅을 사용했습니다. 불행히도이 문제를 해결할 방법을 찾지 못했습니다. 내가 할 수있는 유일한 방법은 수동으로 경로 훅을 제거하고'sys' 캐시를 지우고 모든 것을 다시 가져 오는 것입니다. 그러나 일부 절인 된 데이터가있는 경우 동일한 클래스 이름을 사용하여 해당 파일을 unpickle해야합니다 (즉, from packageA.moduleA import ClassA를 유지해야 함을 의미합니다). 언 피클 링을하면 올바른 이름을 사용하여 다시 피클 할 수 있습니다. – Bakuriu