[python] 서브 디렉토리에서 파일을 가져 오시겠습니까?

에있는이라는 파일이 tester.py있습니다 /project.

/project라는 하위 디렉토리가 lib있으며 다음과 같은 파일이 있습니다 BoxTime.py.

/project/tester.py
/project/lib/BoxTime.py

나는 가져올 BoxTime에서 tester. 나는 이것을 시도했다 :

import lib.BoxTime

결과 :

Traceback (most recent call last):
  File "./tester.py", line 3, in <module>
    import lib.BoxTime
ImportError: No module named lib.BoxTime

BoxTime하위 디렉토리에서 가져 오는 방법에 대한 아이디어가 있습니까?

편집하다

__init__.py문제 였지만을 참조하는 것을 잊지 마세요 BoxTimelib.BoxTime, 또는 사용 :

import lib.BoxTime as BT
...
BT.bt_function()



답변

http://docs.python.org/tutorial/modules.html 여기에서 패키지 문서 (섹션 6.4)를보십시오.

요컨대, 당신은 이름이 빈 파일을 넣어야합니다

__init__.py

“lib”디렉토리에 있습니다.


답변

  • 이라는 서브 디렉토리를 작성하십시오 lib.
  • 라는 빈 파일을 만듭니다 lib\__init__.py.
  • 에서 다음 과 같은 lib\BoxTime.py함수를 작성 foo()하십시오.

    def foo():
        print "foo!"
  • 위 디렉토리의 클라이언트 코드에서 다음을 lib작성하십시오.

    from lib import BoxTime
    BoxTime.foo()
  • 클라이언트 코드를 실행하십시오. 당신은 얻을 것이다 :

    foo!

훨씬 나중에-리눅스에서는 다음과 같이 보일 것입니다 :

% cd ~/tmp
% mkdir lib
% touch lib/__init__.py
% cat > lib/BoxTime.py << EOF
heredoc> def foo():
heredoc>     print "foo!"
heredoc> EOF
% tree lib
lib
├── BoxTime.py
└── __init__.py

0 directories, 2 files
% python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lib import BoxTime
>>> BoxTime.foo()
foo!


답변

삽입 할 수 있습니다 sys.path:

sys.path.insert(0, './lib')
import BoxTime


답변

모든 사람들이 lib디렉토리 를 만들어야한다고 제안하기 때문에 이것을 작성하고 있습니다.

하위 디렉토리 이름을 지정할 필요가 없습니다 lib. anything입력 한 이름을 지정할 수 있습니다 __init__.py.

리눅스 쉘에서 다음 명령을 입력하면됩니다 :

$ touch anything/__init__.py 

이제 다음 구조를 갖습니다.

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

그럼 당신은 가져올 수 mylibmain.py같은 :

from anything import mylib

mylib.myfun()

다음과 같이 함수와 클래스를 가져올 수도 있습니다.

from anything.mylib import MyClass
from anything.mylib import myfun

instance = MyClass()
result = myfun()

내부에 배치 한 모든 변수 함수 또는 클래스 __init__.py에도 액세스 할 수 있습니다.

import anything

print(anything.myvar)

또는 이렇게 :

from anything import myvar

print(myvar)


답변

lib 디렉토리에 __init__.py파일이 있습니까?

파이썬은 __init__.py디렉토리가 모듈인지 확인하기 위해 사용 합니다.


답변

시도하십시오 import .lib.BoxTime. 자세한 정보는 PEP 328의 상대 가져 오기에 대해 읽으십시오 .


답변

나는 기본적으로 모든 경우를 다루는이 작업을 수행합니다 ( __init__.py상대 / 경로 / to / your / lib / 폴더에 있는지 확인하십시오 ).

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()

예 :
프로젝트 폴더에 있습니다.

/root/myproject/app.py

다른 프로젝트 폴더에 있습니다.

/root/anotherproject/utils.py
/root/anotherproject/__init__.py

/root/anotherproject/utils.py그 안에있는 foo 함수 를 사용 하고 호출 하려고 합니다.

따라서 app.py로 작성하십시오.

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils

utils.foo()