다른 파이썬 파일을 가져 오는 방법?


798

파이썬에서 다른 파일을 어떻게 가져 옵니까?

  1. 정확히 같은 파이썬 파일을 어떻게 가져올 수 import file.py있습니까?
  2. 특정 파일 대신 폴더를 가져 오려면 어떻게해야합니까?
  3. 사용자 입력을 기반으로 런타임에 Python 파일을 동적으로로드하고 싶습니다.
  4. 파일에서 하나의 특정 부분 만로드하는 방법을 알고 싶습니다.

예를 들어, main.py나는 가지고있다 :

from extra import * 

이것은의 모든 정의를 제공하지만 extra.py어쩌면 내가 원하는 것은 단일 정의 일뿐입니다.

def gap():
    print
    print

나는 어떻게 추가합니까 import단지 수에 문 gap에서 extra.py?


답변:


443

importlib프로그래밍 방식으로 모듈을 가져 오기 위해 Python 3에 추가되었습니다. 그냥 래퍼 일뿐 입니다. 문서를__import__ 참조하십시오 .

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

참고 :에서 .py확장자를 제거해야합니다 moduleName. 이 함수는 또한 package상대적 가져 오기에 대한 인수를 정의합니다 .


업데이트 : 아래 답변이 오래되었습니다 . 위의 최신 대안을 사용하십시오.

  1. 그냥 import file'평'확장자없이.

  2. 이라는 빈 파일을 추가하여 폴더를 패키지로 표시 할 수 있습니다 __init__.py.

  3. __import__기능을 사용할 수 있습니다 . 모듈 이름을 문자열로 사용합니다. (다시 : '.py'확장자가없는 모듈 이름)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))
    

    help(__import__)자세한 내용을 입력 하십시오.


7
당신이를 추가 할 경우 import filename받는 초기화 평 당신은 폴더 이름으로 직접 모듈을 가져올 수 있습니다.
CornSmith

9
에서 help(__import__):Because this function is meant for use by the Python interpreter and not for general use it is better to use importlib.import_module() to programmatically import a module.
Tadhg McDonald-Jensen

6
패키지가 아니라 스크립트 파일 인 경우 어떻게합니까?
Jonathan

3
동일한 경로에서 스크립트 파일을 가져 오면 (파이썬 검색 경로의 스크립트 파일에서도 작동 할 수 있음) import filenamenoextPython 3.4.8 에서 제대로 작동합니다 .
Alex Hall

7
2019 년에도 여전히 정확합니까? python3 또는 2입니까?
Sandburg

1030

파이썬 파일을 가져 오는 방법에는 여러 가지가 있으며 모두 장단점이 있습니다.

자신에게 적합한 첫 번째 가져 오기 전략을 서둘러 선택하지 마십시오. 그렇지 않으면 나중에 필요에 맞지 않을 때 코드베이스를 다시 작성해야합니다.

가장 쉬운 예 # 1을 설명하고 가장 전문적이고 강력한 예 # 7로 넘어가겠습니다.

예제 1, 파이썬 인터프리터로 파이썬 모듈 가져 오기 :

  1. 이것을 /home/el/foo/fox.py에 넣으십시오.

    def what_does_the_fox_say():
      print("vixens cry")
  2. 파이썬 인터프리터에 들어가십시오.

    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>> 

    python 인터프리터를 통해 fox를 가져 what_does_the_fox_say()오고 fox.py 내 에서 python 함수 를 호출했습니다.

예제 2, 스크립트 에서execfile 또는 ( execPython 3 )를 사용 하여 다른 파이썬 파일을 제 위치에서 실행하십시오.

  1. 이것을 /home/el/foo2/mylib.py에 넣으십시오.

    def moobar():
      print("hi")
  2. 이것을 /home/el/foo2/main.py에 넣으십시오.

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. 파일을 실행하십시오.

    el@apollo:/home/el/foo$ python main.py
    hi

    함수 moobar는 mylib.py에서 가져와 main.py에서 사용할 수있게되었습니다.

예제 3, ...에서 가져 오기 ... 기능 :

  1. 이것을 /home/el/foo3/chekov.py에 넣으십시오.

    def question():
      print "where are the nuclear wessels?"
  2. 이것을 /home/el/foo3/main.py에 넣으십시오.

    from chekov import question
    question()
  3. 다음과 같이 실행하십시오.

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?

    chekov.py에서 다른 기능을 정의한 경우, 다른 기능을 사용하지 않으면 사용할 수 없습니다 import *

예 4, riaa.py를 가져 오는 위치와 다른 파일 위치에있는 경우 가져 오기

  1. 이것을 /home/el/foo4/stuff/riaa.py에 넣으십시오.

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. 이것을 /home/el/foo4/main.py에 넣으십시오.

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
  3. 그것을 실행 :

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans

    외부 파일의 모든 것을 다른 디렉토리에서 가져옵니다.

예 5, 사용 os.system("python yourfile.py")

import os
os.system("python yourfile.py")

예제 6, python startuphook 피기 백을 통해 파일을 가져옵니다.

업데이트 : 이 예제는 python2와 3 모두에서 작동했지만 python2에서만 작동합니다. python3은이 사용자 startuphook 기능 세트를 제거했습니다.이 기능은 기술이 부족한 python 라이브러리 작성자에 의해 악용되어 모든 사용자 정의 프로그램 이전에 코드를 전역 네임 스페이스에 무례하게 삽입하는 데 사용되었습니다. 이것이 python3에서 작동하려면 더 창의력을 가져야합니다. 내가 그것을하는 방법을 알려 주면, 파이썬 개발자는 그 기능 세트도 비활성화 할 것이므로 스스로해야합니다.

참조 : https://docs.python.org/2/library/user.html

이 코드를 홈 디렉토리에 넣으십시오. ~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

이 코드를 main.py에 넣으십시오 (어디서나 가능) :

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

그것을 실행하면 다음을 얻을 수 있습니다.

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

여기에 오류가 발생 ModuleNotFoundError: No module named 'user'하면 python3을 사용한다는 의미이며 기본적으로 startuphooks가 비활성화되어 있습니다.

이 jist의 크레딧은 https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 입니다. 보트를 따라 보내십시오.

예제 7, 가장 강력한 방법 : bare import 명령을 사용하여 파이썬으로 파일을 가져옵니다.

  1. 새 디렉토리를 만드십시오 /home/el/foo5/
  2. 새 디렉토리를 만드십시오 /home/el/foo5/herp
  3. __init__.pyherp 아래에 빈 파일을 만듭니다 .

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. / home / el / foo5 / herp / derp 디렉토리를 새로 만드십시오

  5. derp에서 다른 __init__.py파일을 만듭니다 .

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. / home / el / foo5 / herp / derp 아래에 yolo.pyPut this 라는 새 파일을 작성하십시오 .

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. 진실의 순간, 새 파일을 만들고, /home/el/foo5/main.py거기에 넣으 십시오 .

    from herp.derp.yolo import skycake
    skycake()
  8. 그것을 실행 :

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!

    __init__.py파일은 개발자가이 디렉토리를 가져 오기 가능한 패키지로 만들고자하는 파이썬 인터프리터와 통신합니다.

디렉토리 아래에 모든 .py 파일을 포함시키는 방법에 대한 내 게시물을 보려면 https://stackoverflow.com/a/20753073/445131을 참조하십시오.


6
또한 예제 6 : using을 추가해야합니다 __import__(py_file_name). 어쨌든 놀라운 가이드
oriadam

4
가져 오기 문제가있을 때마다이 질문으로 끝나고 항상 내 문제를 해결할 수 있습니다. 당신이 나를 도울 때마다 내가 이것을 공언 할 수 있다면 나는 할 것입니다.
dgBP

4
이 모든 것의 큰 차이점은 무엇이며 왜 다른 것보다 낫습니까? 예를 들어 5는 "bare import 명령을 사용하여 python에서 파일 가져 오기"를 작성하지만 예제 1, 3 및 4의 (bare?) import 명령도 사용합니까?
HelloGoodbye

34
좋은 대답이지만 항상 다른 가져 오기 파일을 예제로 사용한다는 사실은 읽기가 번거 롭습니다.
59 초에 생성

2
Windows에서 작업하더라도 가져 오기는 대소 문자를 구분한다는 점을 강조하고 싶습니다. 따라서 Module.py 를 사용할 수 없으며 코드 가져 오기 모듈
radato

66

알려진 런타임 이름으로 '런타임'에 특정 Python 파일을 가져 오려면 :

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

내 친구는 오늘 이것을 운없이 확인했습니다-파일 이름이 없어야합니다. 그는 상위 디렉토리에서 로컬 파일을 사용했으며 "./"는 마지막에 상위 디렉토리 (..)처럼 작동했습니다. 게시물의 문제 해결이 거부되었습니다-아마도 오해 (?) 확실하지 않은 경우 sys.path를 인쇄하고 레코드를 비교하십시오.
Tom

29

한 폴더에서 다른 폴더로 파이썬 파일을 가져 오는 복잡한 방법은 많지 않습니다. 그냥 만들 __init__.py 이 폴더는 파이썬 패키지 선언하고 다음 방금 유형을 가져올 경우 호스트 파일에 가서 파일을

from root.parent.folder.file import variable, class, whatever


14
상대 경로를 원하면 어떻게합니까?
domih

21

문서 가져 오기 ..- 참조 링크

__init__.py파일이 패키지를 포함하는 것으로 파이썬 치료를 디렉토리를 만들기 위해 필요, 이것은 의도하지 않게 모듈 검색 경로에 이상이 발생 유효한 모듈을 숨기고에서, 같은 문자열로 공통 이름을 가진 디렉토리를 방지하기위한 것입니다.

__init__.py빈 파일 일 수도 있지만 패키지의 초기화 코드를 실행하거나 __all__변수를 설정할 수도 있습니다.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module

19

첫 번째 경우 : file A.py에서 file 을 가져 오려면 B.py이 두 파일이 다음과 같은 동일한 폴더에 있습니다.

. 
├── A.py 
└── B.py

파일 에서이 작업을 수행 할 수 있습니다 B.py:

import A

또는

from A import *

또는

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

그러면 파일 A.py에서 파일 의 모든 기능을 사용할 수 있습니다B.py


두 번째 경우 : file folder/A.py에서 file 을 가져 오려면 B.py이 두 파일이 다음과 같은 동일한 폴더에 있지 않습니다.

.
├── B.py
└── folder
     └── A.py

파일 B에서이를 수행 할 수 있습니다.

import folder.A

또는

from folder.A import *

또는

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

그러면 파일 A.py에서 파일 의 모든 기능을 사용할 수 있습니다B.py


요약 : 첫 번째 경우 file A.py은 file B.py에서 가져 오는 모듈이며 구문을 사용했습니다 import module_name. 두 번째 경우 folder에는 모듈을 포함하는 패키지이며 A.py구문을 사용했습니다 import package_name.module_name.

패키지 및 모듈에 대한 자세한 내용은이 링크를 참조하십시오 .


약간의 변형으로 시도해 보았습니다. from folder_a.script import *Script.py는 a 폴더 아래에 있습니다.
Justin

+1 이것은 내가 찾던 것입니다. 다른 답변을 이해할 수 없지만 디렉토리를 사용하여 설명했습니다.
Black Thunder

상위 디렉토리에있는 py 파일을 가져 오려면 어떻게합니까?
bytedev

1
@bytedev 추가 import sys하고 sys.path.append("..")파일의 시작 부분에. 이에 따르면 stackoverflow.com/a/48341902/6057480 . 테스트를 거쳐 완벽하게 작동하면이 작업을 수행 한 후에 부모 디렉토리에서 py 파일을 가져올 수 있으며 동일한 디렉토리 및 하위 디렉토리에서 py 파일을 가져올 수 있습니다.
Bohao LI

17
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

다음은 내가 지금 이해 한 간단한 두 가지 방법이며 라이브러리로 가져 오려는 "file.py"파일이 현재 디렉토리에만 있는지 확인하십시오.


9

정의 된 함수가 파일에있는 경우 x.py:

def greet():
    print('Hello! How are you?')

함수를 가져올 파일에서 다음을 작성하십시오.

from x import greet

파일의 모든 기능을 가져 오지 않으려는 경우에 유용합니다.


7

.py 파일을 가져 오는 가장 좋은 방법은입니다 __init__.py. 가장 간단한 방법 __init__.py은 your.py 파일과 동일한 디렉토리에 빈 파일을 만드는 것입니다.

Mike Grouchy 의이 __init__.py파이썬 패키지의 제작, 가져 오기 및 설정에 대한 훌륭한 설명 과 사용법입니다.


1
@GhostCat 응답을 업데이트했습니다. "바람직하다"라는 링크에 감사드립니다.
최고

모든 사람이 시간대에 살고있는 것은 아닙니다.
GhostCat

4
Mike Grouchy의 게시물의 내용, 특히 404 링크 이후에 게시해야합니다. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/...
qwr

6

가져 오는 방법은 파일을 가져오고 이름의 속기를 사용합니다.

import DoStuff.py as DS
DS.main()

잊지 마십시오 당신의 가져 오기 파일이 있다는 되어야합니다 평 확장자 이름


3
하지 않을까요 import DoStuff.py as DS가져 오려고 py에서 DoStuff?
Benj

5

다른 곳에서는 명확하지 않은이 메모를 추가하고 싶습니다. 모듈 / 패키지 내부에서 파일에서로드 할 때 모듈 / 패키지 이름 앞에 접두사를 붙여야합니다 mymodule. 다음 mymodule과 같은 레이아웃을 상상해보십시오 .

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

내용 에서 somefile.py/ otherstuff.py를 로드 할 때 __init__.py다음과 같아야합니다

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

2

경우에 모듈을 가져올는 하위 디렉토리에 있지 , 다음, 다음을 시도하고 실행 app.py가장 깊은 공통 상위 디렉토리에서 :

디렉토리 구조 :

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

에서 app.py, sys.path에 대한 클라이언트의 APPEND 경로 :

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

선택 사항 (예를 들어 구성을로드하는 경우) (검사는 내 사용 사례에서 가장 강력한 것으로 보입니다)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

운영

user@host:/path/to/common_dir$ python3 application/app.py

이 솔루션은 PyCharm뿐만 아니라 병원에서도 효과적입니다.


2

abc.py라는 이름으로 파이썬 스크립트를 포함시키는 몇 가지 방법이 있습니다.

  1. 예를 들어 파일 이름이 abc.py (import abc) 인 경우 제한은 파일이 호출하는 Python 스크립트와 동일한 위치에 있어야한다는 것입니다.

수입 ABC

  1. 예를 들어 파이썬 파일이 Windows 폴더 안에있는 경우. Windows 폴더는 호출하는 Python 스크립트와 동일한 위치에 있습니다.

폴더에서 가져 오기 abc

  1. abc.py 스크립트가 폴더 안에있는 internal_folder 내부에서 사용 가능한 경우

folder.internal_folder에서 가져 오기 abc

  1. 위의 James가 대답 한 것처럼 파일이 고정 위치에있는 경우

import os
import sys
scriptpath = "../Test/MyModule.py"sys.path.append
(os.path.abspath (scriptpath))
import MyModule

파이썬 스크립트가 업데이트되어 업로드하지 않으려는 경우 자동 새로 고침에이 명령문을 사용하십시오. 보너스 :)

%load_ext autoreload 
%autoreload 2

1

다른 파이썬 파일에서 파이썬 파일을 가져 오려면

helper.py 파이썬 파일이 있다고 가정봅시다 .

def display():
    print("I'm working sundar gsv")

이제 app.py 에서는 표시 기능을 사용할 수 있습니다.

import helper
helper.display()

출력

I'm working sundar gsv

참고 : .py 확장자를 지정할 필요가 없습니다.


1

래퍼 스크립트를 만드는 경우 가져 오려는 파일에 대한 심볼릭 링크를 만들 수 있습니다.


1

당신은 또한 이것을 할 수 있습니다 : from filename import something

예 : 확장명이 from client import Client 필요하지 않습니다 .py .pyw .pyui.


1

이것은 파이썬 파일에서 함수를 호출하는 방법입니다.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)

기능을 직접 사용하는 것보다 새로운 기능을 개선하는 방법은 무엇입니까?
qwr

@qwr 새로운 함수 callfunc ()는 단순히 파이썬 파일에서 대상 함수를 동적으로 호출하는 코드 래퍼입니다. 주어진 예는 파이썬 파일 "pathto / myfile.py"의 대상 "myfunc"입니다. "기능을 직접 사용"한다는 것은 무엇을 의미합니까?
Xiao-Feng Li

나를 위해 완벽하게 일했습니다. 이 예에서는를로 대체 from mypath import Path했습니다 Path = callfunc("/folder/to/mypath.py", "Path"). 감사합니다 @ Xiao-FengLi
user319436

@ user319436 누군가 내 대답이 다행입니다. :)
Xiao-Feng Li

@ xiao-feng-li 님, 감사합니다! 좋은 대답 !!
Altieres de Matos

0

위에 나열된 것처럼 여러 가지 방법이 있지만 파일의 내용을 가져오고 싶고 줄과 줄을 쓰지 않고 다른 모듈 을 가져올 필요가 없다는 것을 알았 습니다 . 따라서 file.property가져온 파일을 사용자 파일과 병합하는 대신 점 구문 ( )을 사용하여 파일의 내용을 얻는 방법을 생각해 냈습니다 .
우선, 여기 가져올 파일이 있습니다.data.py

    testString= "A string literal to import and test with"


참고 :.txt 대신 확장을 사용할 수 있습니다 .
에서는 mainfile.py, 개방과 내용을 얻어서 시작합니다.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

이제 내용이 문자열로되어 있지만 액세스하려고 하면 클래스 의 인스턴스 data.testString처럼 오류가 발생 하며 속성이 있어도 예상 한대로 수행되지 않습니다. 다음으로 클래스를 만듭니다. 예를 들어 (말장난 의도)datastrtestString
ImportedFile

    class ImportedFile:

그리고 이것을 적절한 들여 쓰기로 넣습니다.

    exec(data)


마지막으로 data다음과 같이 다시 할당하십시오 .

    data=ImportedFile()

그리고 그게 다야! 다른 모듈과 마찬가지로 액세스하면 입력 print(data.testString)하면 콘솔에 인쇄됩니다 A string literal to import and test with.
그러나 from mod import *클래스, 인스턴스 할당을 삭제하고을 빼는 것과 같습니다 exec.

이것이 도움이
되기를 바랍니다 :) -Benji


파일의 내용을 문자열로 읽는 것을 진지하게 생각하고 사람들이 게시 한 다른 모든 솔루션이있을 때 파일을 실행하는 것이 좋은 해결책입니까?
qwr

@qwr Erm 예, 그렇습니다. 어떤 상황에서는 다른 많은 답변이 작동하지 않습니다. 그렇기 때문에 일하기 쉬운 방법이 필요했습니다. 다른 관점에서 볼 수없는 경우 공식 IDLE을 사용해보십시오.
Benj

0

파이썬에서 잘 알려지지 않은 기능 중 하나는 zip파일 을 가져 오는 기능입니다 .

library.zip
|-library
|--__init__.py

__init__.py패키지 파일 에는 다음이 포함됩니다.

def dummy():
    print 'Testing things out...'

zip 아카이브에서 패키지를 가져올 수있는 다른 스크립트를 작성할 수 있습니다. zip 파일을 sys.path에 추가하기 만하면됩니다.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()

zip 파일은 어떤 이점을 제공합니까?
qwr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.