他のPythonファイルをインポートする方法は?


799

Pythonで他のファイルをインポートするにはどうすればよいですか?

  1. どのように特定のpythonファイルを正確にインポートできますimport file.pyか?
  2. 特定のファイルではなくフォルダをインポートするにはどうすればよいですか?
  3. ユーザー入力に基づいて、実行時にPythonファイルを動的にロードしたい。
  4. ファイルから特定のパーツを1つだけロードする方法を知りたい。

たとえば、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「.py」拡張子なし。

  2. という名前の空のファイルを追加して、フォルダーをパッケージとしてマークできます__init__.py

  3. __import__関数を使用できます。モジュール名を文字列として受け取ります。(ここでも、「。py」拡張子のないモジュール名。)

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

    help(__import__)詳細については、入力してください。


7
init .pyにを追加するimport filenameと、モジュールをフォルダー名として直接インポートできます。
CornSmith 2013

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 2016

6
パッケージではなくスクリプトファイルの場合はどうなりますか?
ジョナサン

3
同じパスでスクリプトファイルをインポートする場合(Python検索パスのスクリプトファイルでも機能する可能性があります)、import filenamenoextPython 3.4.8では問題なく動作します。
アレックスホール

7
2019年もまだ正確ですか?それはpython3または2ですか?
サンドバーグ

1032

Pythonファイルをインポートするには多くの方法があり、すべて長所と短所があります。

すぐに機能する最初のインポート戦略を急いで選択しないでください。そうしないと、コードベースを後でニーズに合わない場合に書き直す必要があります。

最も簡単な例1の説明から始め、次に最もプロフェッショナルで堅牢な例7に移ります。

例1、Pythonインタープリターを使用してPythonモジュールをインポートします。

  1. これを/home/el/foo/fox.pyに入れます:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Pythonインタープリターに入る:

    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 or(execPython 3の場合)を使用して、他のpythonファイルを実行します。

  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:from ... import ...機能の使用:

  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の起動フックをピギーバックしてファイルをインポートします。

更新:この例はpython2と3の両方で機能していましたが、現在はpython2でのみ機能します。python3は、ユーザー定義のすべてのプログラムの前に、低スキルのpythonライブラリライターが悪用してコードをグローバルネームスペースに無作為に挿入したため、このユーザースタートアップフック機能セットを削除しました。これをpython3で機能させる場合は、より創造的になる必要があります。その方法を説明すると、Python開発者もその機能セットを無効にするので、ご自分で作業してください。

参照: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 up-boatsに送信されます。

例7、最も堅牢:最小限のインポートコマンドでPythonにファイルをインポートします。

  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 in there という新しいファイルを作成します。

    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ファイルは、開発者がこのディレクトリをインポート可能なパッケージにすることを意図していることをPythonインタープリターに伝えます。

ディレクトリの下にすべての.pyファイルを含める方法に関する私の投稿を表示するには、https//stackoverflow.com/a/20753073/445131を参照してください。


6
例6:を使用して追加する必要もあり__import__(py_file_name)ます。とにかくすばらしいガイド
oriadam

4
インポートの問題が発生するたびに、私はこの質問にたどり着き、いつでも問題を解決することができます。あなたが私を助けてくれるたびに私がこれを賛成できれば、私はそうします。
dgBP 2016

4
これらすべての大きな違いは何ですか?なぜ他のどれよりも優れているのはなぜですか?例5では、「裸のインポートコマンドを使用してPythonでファイルをインポートする」と記述していますが、例1、3、4では(bare?)importコマンドも使用していますか。
HelloGoodbye

34
正解ですが、例として常に別のインポートファイルを使用しているため、読みづらくなっています。
2017年

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

あるフォルダーから別のフォルダーにpythonファイルをインポートするための複雑な方法は多くありません。__init__.pyファイルを作成して、このフォルダーがpythonパッケージであることを宣言し、インポートするホストファイルに移動します。

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


15
相対パスが必要な場合はどうなりますか?
domih 2017年

21

インポートドキュメント..-参照用リンク

__init__.pyファイルはPythonがパッケージを含むようディレクトリを扱うために必要であり、これは意図せずにモジュール検索パス上に、後に発生し、有効なモジュールを隠してから、そのような文字列として、一般的な名前でディレクトリを防ぐために行われています。

__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、これらの2つのファイルは次のように同じフォルダーにあります。

. 
├── 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


2番目のケース:次のように、ファイルfolder/A.pyをfile にインポートする場合B.py、これら2つのファイルは同じフォルダーにありません。

.
├── 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


概要:最初のケースでA.pyは、file はfile B.pyにインポートするモジュールであり、構文を使用しましたimport module_name。2番目のケースでfolderは、モジュールを含むパッケージでA.py、構文を使用しましたimport package_name.module_name

パッケージとモジュールの詳細については、このリンクを参照してください


少し変化をつけてみましたが、うまくいきました。from folder_a.script import *Script.pyはフォルダーaの下にあります。
ジャスティン

+1これは私が探していたものです。他の回答は理解できませんでしたが、ディレクトリを使用して説明しました。
ブラックサンダー

親ディレクトリにある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

これが私が理解した2つの簡単な方法です。ライブラリとしてインポートする「file.py」ファイルが現在のディレクトリにのみ存在することを確認してください。


9

定義された関数がファイル内にある場合x.py

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

関数をインポートするファイルに、次のように書き込みます。

from x import greet

これは、ファイル内のすべての関数をインポートしたくない場合に役立ちます。


7

.pyファイルをインポートする最良の方法は、を使用することです__init__.py。最も簡単なことは、__init__.pyyour.pyファイルが置かれているのと同じディレクトリに名前が付けられた空のファイルを作成することです。

Mike Grouchyによるこの投稿は、__init__.pyPythonパッケージの作成、インポート、および設定に関する優れた説明とその使用法です。


1
@GhostCat返信を更新しました。「それが望ましいだろう」というリンクをありがとう。
2017年

そして、誰もがあなたのタイムゾーンに住んでいるわけではないことを理解してください。
GhostCat 2017年

4
Mike Grouchyの投稿の内容を投稿する必要があります。リンクが404になったときは特にそうです。web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/...
QWR

6

インポート方法は、ファイルをインポートし、その名前の省略形を使用することです。

import DoStuff.py as DS
DS.main()

インポートするファイルの名前には.py拡張子を付ける必要があることを忘れないでください。


3
import DoStuff.py as DSからのインポートpyを試みませんDoStuffか?
ベンジ

5

他の場所ではあまりはっきりしていませんが、このメモを追加したいと思います。モジュール/パッケージ内では、ファイルからロードするとき、モジュール/パッケージ名の前にを付ける必要がありますmymodulemymoduleこのようなレイアウトであることを想像してください:

/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に追加します。

import os, sys, inspect

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

オプション(たとえば、configsをロードする場合)(私の使用例では、Inspectが最も堅牢なようです)

# 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だけでなく、cliでも私にとって機能します。


2

Pythonスクリプトをabc.pyという名前で含める方法はいくつかあります

  1. たとえば、ファイルの名前がabc.py(abcのインポート)である場合、制限は、ファイルが呼び出し側のpythonスクリプトと同じ場所に存在する必要があることです。

ABCをインポート

  1. たとえば、pythonファイルがWindowsフォルダ内にある場合。Windowsフォルダーは、呼び出し元のpythonスクリプトと同じ場所にあります。

フォルダインポートabcから

  1. Incase abc.pyスクリプトは、フォルダー内に存在するinternal_internal_folderで使用できます

from folder.internal_folder import abc

  1. 上記のJamesが回答したように、ファイルが固定された場所にある場合

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

Pythonスクリプトが更新され、アップロードしたくない場合は、これらのステートメントを使用して自動更新します。ボーナス:)

%load_ext autoreload 
%autoreload 2

1

Pythonファイルを別のPythonファイルにインポートするだけです

のような表示機能を持つhelper.py pythonファイルがあるとしましょう、

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

これは、私がpythonファイルから関数を呼び出す方法でした。これは、任意の関数を呼び出すために柔軟です。

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()は、Pythonファイルのターゲット関数を動的に呼び出すコードの単なるラッパーです。与えられた例は、Pythonファイル「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として取得されましたがdatastrクラスのインスタンスと同様にアクセスしようとするとエラーが発生します。また、プロパティが含まれていても、testString期待どおりに動作しません。
次に、クラスを作成します。たとえば(しゃれ意図)、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 2019年

@qwr Ermはい、そうです。他の回答の多くは、状況によっては機能しません。そのため、確実に機能する簡単な方法が必要でした。別の観点から物事を見ることができない場合は、公式のIDLEを使用する必要があります。
Benj

0

Pythonの非常に未知の機能の1つは、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.