상대 경로에서 모듈 가져오기
상대 경로를 지정하여 Python 모듈을 Import하려면 어떻게 해야 합니까?
를 들어, 「」의 ,dirFoo
Foo.py
★★★★★★★★★★★★★★★★★」dirBar
, , , , 입니다.dirBar
Bar.py
, Import 방법Bar.py
Foo.py
다음은 시각적인 표현입니다.
dirFoo\
Foo.py
dirBar\
Bar.py
Foo
시키고 싶다Bar
폴더 계층을 재구성할 수 없습니다.
Python 하면 ('Python'이 ).__init__.py
파일)을 사용하여 스크립트의 위치에 상대적으로 모듈을 포함하기 위한 안전한 솔루션을 소개합니다.
스크립트에 모듈 세트를 포함해야 하기 때문에 이 작업을 수행해야 한다고 생각합니다.여러 제품에서 이 기능을 사용하고 있습니다.다른 디렉토리에서 호출된 스크립트나 python에서 실행되는 스크립트는 새로운 인터프리터를 여는 대신 실행됩니다.
import os, sys, inspect
# realpath() will make your script run, even if you symlink it :)
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
if cmd_folder not in sys.path:
sys.path.insert(0, cmd_folder)
# Use this if you want to include modules from a subfolder
cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
if cmd_subfolder not in sys.path:
sys.path.insert(0, cmd_subfolder)
# Info:
# cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
# __file__ fails if the script is called in different ways on Windows.
# __file__ fails if someone does os.chdir() before.
# sys.argv[0] also fails, because it doesn't not always contains the path.
이 접근방식은 시스템에 설치된 모듈 대신 Python이 모듈을 사용하도록 강제할 수 있습니다.
경고!현재 모듈이 내부 모듈일 때 무슨 일이 일어나는지 잘 모르겠습니다.egg
일일니아아아
에 dirBar가 합니다.__init__.py
file - Python - Python - Python - Python - Python - Python file - - file file file - -
Python 경로에 하위 디렉토리를 추가하여 일반 스크립트로 가져올 수도 있습니다.
import sys
sys.path.insert(0, <path to dirFoo>)
import Bar
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)
import mymodule
다른 폴더에서 .py 파일을 가져오려면 간단한 작업을 수행합니다.
다음과 같은 디렉토리가 있다고 가정합니다.
lib/abc.py
그런 다음 이름 그대로 lib 폴더에 빈 파일을 보관합니다.
__init__.py
그리고 나서
from lib.abc import <Your Module name>
「 」는 .__init__.py
수입하다
프로젝트를 이렇게 구성하는 경우:
src\
__init__.py
main.py
dirFoo\
__init__.py
Foo.py
dirBar\
__init__.py
Bar.py
Foo.py에서 다음 작업을 수행할 수 있습니다.
import dirFoo.Foo
또는 다음 중 하나를 선택합니다.
from dirFoo.Foo import FooObject
, 이 「」, 「」, 「」, 「」가 필요합니다.src
는 '접근하다'를 할 수 있습니다.site_packages
또는 검색 경로. 그가 처럼, 또, also, also, 급, also, also, also, also, also, also, also.__init__.py
는 해당 패키지 또는 디렉토리의 모듈을 처음 Import할 때 암묵적으로 Import됩니다.은 「」입니다.__init__.py
단순히 빈 파일입니다.
가장 쉬운 방법은 sys.path.append()를 사용하는 것입니다.
단, imp 모듈에도 관심이 있을 수 있습니다.내부 가져오기 기능에 대한 액세스를 제공합니다.
# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file
모듈 이름을 모를 때 모듈을 동적으로 로드하기 위해 사용할 수 있습니다.
과거에, 애플리케이션 전용의 플러그 인 타입의 인터페이스를 작성해, 유저가 특정의 디렉토리에 스크립트를 드롭 할 수 있도록 했습니다.
또, 다음의 기능도 도움이 됩니다.
imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)
관련된 PEP는 다음과 같습니다.
http://www.python.org/dev/peps/pep-0328/
특히 dirFoo가 dirBar에서 올라온 디렉토리라고 가정하면...
dirFoo\Foo.py의 경우:
from ..dirBar import Bar
스크립트를 변경하지 않고 가장 쉬운 방법은 PYTONPATH 환경변수를 설정하는 것입니다.sys.path는 다음 위치에서 초기화됩니다.
- 입력 스크립트를 포함한 디렉토리(또는 현재 디렉토리).
- PYTONPATH(셸 변수 PATH와 동일한 구문을 가진 디렉토리 이름 목록).
- 설치에 의존하는 기본값입니다.
그냥 실행:
export PYTHONPATH=/absolute/path/to/your/module
다음과 같이 sys.path에는 위의 경로가 포함됩니다.
print sys.path
['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
내 생각에 가장 좋은 선택은 __ init __을 폴더에 넣고 파일을 호출하는 것이다.
from dirBar.Bar import *
기존 python 패키지와 동일한 파일 이름을 사용하면 문제가 발생할 수 있으므로 sys.path.append()를 사용하지 않는 것이 좋습니다.나는 그것을 테스트하지 않았지만 그것은 애매할 것이다.
Linux 사용자를 위한 빠르고 더러운 방법
배포 문제에 관심이 없는 경우 심볼릭 링크(파일 시스템이 지원하는 것으로 가정)를 사용하여 모듈 또는 패키지를 요청 모듈의 폴더에 직접 표시할 수 있습니다.
ln -s (path)/module_name.py
또는
ln -s (path)/package_name
" "module"을 입니다.__init__.py
(본격적으로)관점에서 과 패키지는 를 표시합니다.모듈과 패키지는 모두 를 통해 요구된 대로 포함되어 있는 "정의와 스테이트먼트"를 표시합니다.import
명령어를 입력합니다.
참조: http://docs.python.org/2/tutorial/modules.html
from .dirBar import Bar
다음 대신:
from dirBar import Bar
다른 dirBar가 설치되어 있어 foo.py 리더를 혼동할 수 있습니다.
이 경우 Bar.py을 Foo.py으로 Import하려면 먼저 이러한 폴더를 다음과 같은 Python 패키지로 변환합니다.
dirFoo\
__init__.py
Foo.py
dirBar\
__init__.py
Bar.py
그럼 Foo.py에서 다음과 같이 하겠습니다.
from .dirBar import Bar
네임스페이스가 바처럼 보이길 원했다면.무엇이든, 또는
from . import dirBar
dirbar를 네임스페이스로 띄우고 싶으면술집이야 어떻든지요.이 두 번째 케이스는 dirBar 패키지에 더 많은 모듈이 있는 경우에 유용합니다.
__init_.py 파일을 추가합니다.
dirFoo\
Foo.py
dirBar\
__init__.py
Bar.py
그런 다음 Foo.py의 시작 부분에 다음 코드를 추가합니다.
import sys
sys.path.append('dirBar')
import Bar
relative sys.path 예시:
# /lib/my_module.py
# /src/test.py
if __name__ == '__main__' and __package__ is None:
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module
이 답변에 근거해서.
말씀하신 것처럼 보통 메인스크립트가 실행되고 있는 장소에 따라 모듈이 있는 폴더에 액세스 하고 싶기 때문에 Import만 하면 됩니다.
솔루션:
을 가지고 .D:/Books/MyBooks.py
oldies.py)는 oldies.py의 경우입니다. 서브디렉토리에서 .D:/Books/includes
:
import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path) # Just verify it is there
import oldies
를를 place place print('done')
oldies.py
모든 것이 정상인지 확인합니다.Python 에 따르면 Python은 이 합니다.sys.path
목록의 첫 인 " Startup" (프로그램 시작 시 됨)path[0]
는 Python 인터프리터를 호출하기 위해 사용된 스크립트를 포함하는 디렉토리입니다.
수 없는 를 들어 가 대화식으로 표준 를 읽는 " " " " ( " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "path[0]
을 사용하다이것은 Python이 먼저 현재 디렉토리의 모듈을 검색하도록 지시합니다.는, 「」의 되는 것에 해 주세요.PYTHONPATH
.
또 다른 해결책은 py-require 패키지를 설치한 후 다음을 사용하는 것입니다.Foo.py
import require
Bar = require('./dirBar/Bar')
간단하게 사용할 수 .from Desktop.filename import something
예제:
이 「이름」인 로 하고 .
test.py
「」에서Users/user/Desktop
수입하다
코드:
from Desktop.test import *
, 빈 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,__init__.py
다음은 상대 경로를 사용하여 위의 한 수준에서 파일을 가져오는 방법입니다.
기본적으로 작업 디렉토리를 한 단계(또는 상대 위치) 위로 이동하고 경로에 추가한 후 작업 디렉토리를 원래 위치로 이동합니다.
#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path = os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)
저는 비단뱀에 대해 잘 모르기 때문에 틀린 말이 있으면 알려주세요.파일 계층이 다음과 같이 정렬된 경우:
project\
module_1.py
module_2.py
module_1.py
defines defines defines called called called called called called called called called called called called라는 함수를 합니다.func_1()
, module_2.py:
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
뛰어가다python module_2.py
cmd가 됩니까?func_1()
를 정의합니다.일반적으로 동일한 계층 파일을 가져오는 방법입니다. 쓸 는요.from .module_1 import func_1
module_2.py
는 python이라고 .No module named '__main__.module_1'; '__main__' is not a package
문제를 하고 두 패키지로 한 후 세 모듈을 module_2.py
.
project\
package_1\
module_1.py
module_2.py
main.py
main.py:
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
왜 예요?.
전에module_1
module_2.py
만약 우리가 그렇게 하지 않고main.py
는 python이라고 .No module named 'module_1'
까다롭네요module_1.py
module_2.py
func_1()
module_1.py
작업을 수행합니다.
def func_1():
print(__name__)
그그__name__
func_1을 사용하다. 는 ★★★★★★★★★★★★★★★★★★★★★..
전에module_1
, run , runfilename.main.py
, 인쇄합니다.package_1.module_1
아니라, 이에요.module_1
. 은, 「」를 호출하는 「 」를 호출하는 것을 .func_1()
입니다.main.py
, . . . . . . . ..
암시하다module_1
입니다.module_2.py
그 자체입니다. 점이 '점'이 없어요.main.py
module_1
과 같은 될 수 있습니다.package_1
아래'는 아닙니다.
이제 좀 더 복잡하게 해 봅시다.가지고 있다config.ini
메인.py'과 동일한 계층에서 이를 읽기 위한 함수를 정의합니다.
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
어쩔 수 없는 때문에 ' 수 없이'라고 요.module_2.py
따라서 상위 계층에서 Import해야 합니다.py:
import ..config
pass
두 개의 점은 상위 계층에서 가져오기를 의미합니다(상위 계층보다 세 개의 점이 액세스함 등). ★★★★★★★★★★★★★★★★를 실행합니다.main.py
통역사는 다음과 같이 말합니다.ValueError:attempted relative import beyond top-level package
' 패키지는 '최상위 패키지'입니다main.py
. 단지 이유만으로config.py
에 main.py
위계질서, 즉 같은 위계질서입니다.config.py
'가 아닌 'under'가 아니다main.py
가 아니라 ' '납부'가 '납부하다.main.py
더 main.py
문제를 하기 위해 은 다음과 같습니다
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
프로젝트 파일의 계층 구조를 정리하는 원칙과 일치한다고 생각합니다만, 기능이 다른 모듈을 다른 폴더에 배치하고, 외부에 상위 발신자를 남겨 두면, 원하는 대로 Import 할 수 있습니다.
또한 , the, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, the, the, the, the, the, the, the the,sys
★★★★
with open("C:/yourpath/foobar.py") as f:
eval(f.read())
너무 조심스럽다고는 하지만 모든 컴퓨터에서 파일이 항상 같은 위치에 있다고 가정하는 것은 안전하지 않기 때문에 휴대성이 향상되는 것을 좋아합니다.개인적으로 저는 먼저 파일 경로를 조회하는 코드를 가지고 있습니다.Linux 를 사용하고 있기 때문에, 다음과 같이 되어 있습니다.
import os, sys
from subprocess import Popen, PIPE
try:
path = Popen("find / -name 'file' -type f", shell=True, stdout=PIPE).stdout.read().splitlines()[0]
if not sys.path.__contains__(path):
sys.path.append(path)
except IndexError:
raise RuntimeError("You must have FILE to run this program!")
물론 함께 포장할 계획이 아니라면요.그러나 이 경우 두 개의 개별 파일이 필요하지 않습니다.
언급URL : https://stackoverflow.com/questions/279237/import-a-module-from-a-relative-path
'programing' 카테고리의 다른 글
매우 큰 SQL 파일(MySQL)을 Import할 때 단일 커밋 (0) | 2022.09.17 |
---|---|
Composer를 자체 업데이트할 수 없습니다. (0) | 2022.09.17 |
Jest의 it와 test의 차이점은 무엇입니까? (0) | 2022.09.17 |
Jasmine JavaScript 테스트 - 목표와 목표의 비교 (0) | 2022.09.17 |
npm install --legacy-peer-deps는 정확히 무엇을 합니까?언제가 권장됩니까? / 어떤 사용 사례가 있을 수 있습니까? (0) | 2022.09.17 |