0

개요

저는 과학적인 시뮬레이션을 실행 중이며 결과 데이터를 파이썬으로 처리하려고합니다. 시뮬레이션은 시뮬레이션 작성자가 작성한 프로그램 체인 외부에서 사용되지 않는 사용자 정의 데이터 유형을 생성하므로 불행히도 저에게 제공하는 것이 필요합니다.Python에서 클래스 가져 오기 서브 패키지 요청보다 많은 수의 가져 오기

그들은 나에게 두 개의 파일을 설치하려면 :

  • 모든 사용자 기능과 두 개의 데모
  • sdds.py에 헬퍼 기능을 제공 sddsdatamodule.so라는 컴파일 된 모듈을 제공하는 클래스를 정의 sdds.py라는 모듈.

(나는 그들이 너무 얽히게 연결되어있는 두 개의 모듈을 제공하고있어 이상하게 느껴진다. 좋은 코딩 연습처럼 보이지는 않지만 코드를 사용하는 것이 처음부터 다시 작성하는 것보다 낫다.) 나는 그들을 내 경로에 나란히 직접 설치하지 않는 것을 선호합니다. 그들은 같은 회사에서 왔는데 SDDS 형식의 파일을 액세스하고 조작하는 것과 같은 특정 작업을 함께 수행하도록 설계되었습니다.

그래서 나는 그들을 패키지에 넣을 것이라고 생각했습니다. 내 경로에 설치할 수있는 것은 자체적으로 포함되어 있으므로 한 위치에서 모듈을 쉽게 찾고 제거하거나 업그레이드 할 수 있습니다. 그렇다면 크게 파이썬 패키지로 비 Python 솔루션을 숨길 수 있습니다. 우아한 것 같습니다.

세부

실제로 사용하는 패키지는 여기있다 :

http://www.aps.anl.gov/Accelerator_Systems_Division/Accelerator_Operations_Physics/software.shtml#PythonBinaries

불행하게도, 그들은 단지 지금 Windows 및 Mac OS X를 지원합니다. 소스 코드를 컴파일하는 것은 상당히 번거롭고 분명히 Linux/Unix에 대한 중요한 요청이 없습니다. 나는 Mac을 가지고 있기 때문에 고맙게도 이것은 나에게 문제가되지 않는다.

그래서 내 디렉토리 트리는 다음과 같습니다

SDDSPython/     My toplevel package 
    __init__.py    Designed to only import the SDDS class 
    sdds.py     Defines SDDS class and two demo methods 
    sddsdatamodule.so   Defines sddsdata module used by SDDS class. 

__init__.py 파일은 말 그대로에만이 포함

from sdds import SDDS 

sdds.py 파일은 클래스 정의와 두 개의 데모 정의가 포함되어 있습니다. sdds.py 파일의 유일한 코드는 다음과 같습니다

import sddsdata, sys, time 

class SDDS: 
    (lots of code here) 

def demo(output): 
    (lots of code here) 

def demo2(output): 
    (lots of code here) 

그때 dir를 사용하여, SDDSPython을 가져 확인할 수 있습니다

>>> import SDDSPython 
>>> dir(SDDSPython) 
['SDDS', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'sdds', 'sddsdata'] 

그래서 지금 SDDSPython.SDDS

질문을 통해 SDDS 클래스에 액세스 할 수 있습니다

지구 온난화 SDDSPython.sddsSDDSPython.sddsdataSDDSPython 네임 스페이스에로드됩니까 ??

>>> SDDSPython.sdds 
<module 'SDDSPython.sdds' from 'SDDSPython/sdds.pyc'> 
>>> SDDSPython.sddsdata 
<module 'SDDSPython.sddsdata' from 'SDDSPython/sddsdatamodule.so'> 

는 I는 __init__.py 파일 I 특별히 SDDSPython 공간에 적재되는 것을 sddssddsdata 모듈을 제외하고 생각을 만들어. 무슨 일 이니? sddsdatamodule.so 파일의 내용으로 인해 이러한 현상이 발생한다고 가정 할 수 있습니까? 하지만 모듈이 부모의 네임 스페이스에 어떻게 영향을 미칠 수 있습니까? 나는 길을 잃고 어디서부터 시작해야할지 모르겠습니다. C 코드를 살펴 보았지만 의심스런 것은 보이지 않습니다. 공평하게 말하면 아마도 의심스러운 것이 무엇인지 알지 못할 것입니다. 아마도 Python 용 C 확장을 프로그래밍하는 데 익숙하지 않을 것입니다.

답변

0

호기심 많은 질문 - 비슷한 테스트 케이스를 사용하여 조사해 보았습니다.

>>>import XML 
>>>XML.indent 
<module 'XML.indent' from 'XML\indent.py'> 
>>>XML.indent.Xml #did not include this in the from 
<class 'XML.indent.Xml'> 
>>>XML.Sink 
Traceback (most recent call last): 
AttributeError:yadayada no attribute 'Sink' 

이 :

XML/ 
    __init__.py  -from indent import XMLIndentGenerator 
    indent.py   -contains class XMLIndentGenerator, and Xml 
    Sink.py  

즉, 심지어 당신은 단지 일부를 가져 불구하고 모듈에서 클래스 가져 오기는 전체 모듈은 당신이 설명하는 방식에서 액세스 할 수 있음되어 나타납니다 나는 import Sink__init__.py에 넣지 않았으므로 기대된다!

>>>import XML 
>>>XML.Sink 
<module 'XML.Sink' from 'XML\Sink.pyc'> 

그래서, 그것은 나타납니다 : 내가 할 경우이 클래스의 XML 패키지 내에 포함 된 모듈을 수입하기 때문에,

import Sink 

class XMLIndentGenerator(XMLGenerator): 
    (code) 

을 지금 :

나는 indent.py하기 위해 라인을 추가 가져온 sdds 모듈도 sddsdata을 가져 오기 때문에 액세스 할 수 있습니다. 그 질문에 "어떻게"부분에 대답하지만, "왜"이 경우, 나는 문서에 어딘가에 대답을 확신 :

나는 이것이 도움이되기를 바란다. 대답을 입력하십시오! 나를위한 학습 경험.

+0

고맙습니다. 나는 그것이 지금 어떻게되는지를 볼 수있다. 그리고 나는 정말로 그 이유를 알고 싶어한다. – Joel

0

이것은 파이썬 가져 오기가 생각하는대로 작동하지 않기 때문에 발생합니다. 그들은이 같은 작업 :

  • 수입 기계가 types.ModuleType 인스턴스가, 거기에 몇 가지 속성, __name__ 해당 파일 (__file__로 설정되어 생성된다
  • 가져 오기에서 요청 모듈 있어야 할 파일을 찾습니다 등등), 그 객체는 완전한 모듈 이름으로 sys.modules에 삽입됩니다.
  • 하위 모듈 가져 오기 인 경우 (즉, SDDSPython의 하위 모듈 인 sdds.py) 새로 생성 된 모듈은 상위 패키지의 기존 파이썬 모듈에 속성으로 연결됩니다.
  • 해당 파일을 전역 범위로 "실행"합니다. 해당 파일에 정의 된 모든 이름은 모듈의 속성으로 나타납니다.
  • from 가져 오기의 경우 모듈의 특성이 가져 오기 스크립트로 반환 될 수 있습니다.

    import bar 
    

    bar라는 다음 foo는 글로벌가 나는 액세스 할 수 있습니다 : 만의 소스로,이 모듈 (예를 들어, foo.py)을 가져 오는 경우

은 그래서 의미 foo.bar.

"지금 사용하고 싶은 python 스크립트의 일부만 실행하십시오."라는 이유로 파이썬에는 용량이 없습니다. 모든 것이 실행됩니다.

+0

맞아요, 제 경우에는'__init __. py'에서'sdds import SDDS'를했습니다. 대신'sdds 가져 오기 '를 수행했다면'dir (SDDSPython)'만'sdds 만 반환 할 것으로 예상되지만'dir (SDDSPython.sdds)'에는'sddsdata','sys' 및'time '. 'sdds import SDDS'는 어쨌든, sdds 서브 모듈에서 클래스를 가져와야한다고 생각했습니다. 하지만 어쨌든'import sdds, sddsdata '처럼 행동하고 있습니다. 그'sdds import SDDS'는 서브 모듈 가져 오기를하지 않아도 되나요? – Joel

+1

'SDDSPython'은 경로상의 패키지이고,'sdds'는 그 안에 있습니다. 'sdds'를 가져올 때, 파이썬이 어떻게 그것을했는지에 상관없이, 파이썬이 그것을 서브 모듈로 발견하는 한, 그 서브 모듈은 그 패키지를 포함하는 속성에 무조건적으로 추가됩니다. 이것은 수입 기계에 의해 이루어지며, 여러분의'__init __. py'가하는 것과는 별도입니다. – SingleNegationElimination

+0

Ohhhhhhh 알겠습니다. 이것에 대한 문서가 어딘가에 있습니까? – Joel