web-dev-qa-db-ja.com

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

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

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

たとえば、main.pyでは、次のようになります。

from extra import * 

これはextra.pyの中のすべての定義を私に与えますが、たぶん私が欲しいのは単一の定義だけです:

def gap():
    print
    print

extra.pyからimportを取得するためにgapステートメントに何を追加しますか?

607
Tamer

importlibはPythonでプログラム的にモジュールをインポートするための最近の追加です。それは__import__ のまわりのラッパーです。 https://docs.python.org/3/library/importlib.html#module-importlib を参照してください。

import importlib

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

更新:以下の回答は古くなっています 。上記のより新しい代替手段を使用してください。

  1. 拡張子が '.py'のないimport fileだけです。

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

  3. __import__関数を使うことができます。モジュール名を文字列として取ります。 (繰り返しますが、 '。py'拡張子のないモジュール名)

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

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

333
Radian

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をインポートし、fox.py内からpython関数what_does_the_fox_say()を呼び出しました。

例2、スクリプトでexecfileまたは( exec in Python )を使用して他の_を実行します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、...から使用...インポート...機能:

  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は、スキルの低いpythonライブラリ作成者に悪用され、すべてのユーザー定義プログラムの前にコードをグローバル名前空間に無礼に挿入するため、このユーザーstartuphook機能セットを削除しました。これを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を使用していることを意味し、デフォルトではstartuphookは無効になっています。

このjistの功績は次のとおりです。 https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py アップボートに沿って送信.

例7、最も堅牢:pythonのファイルをbare importコマンドでインポートします:

  1. 新しいディレクトリを作成/home/el/foo5/
  2. 新しいディレクトリを作成/home/el/foo5/herp
  3. Herpの下に__init__.pyという名前の空のファイルを作成します。

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

    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

888
Eric Leschinski

特定のPythonファイルを「実行時」に既知の名前でインポートするには

import os
import sys

...

scriptpath = "../Test/MyModule.py"

# 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
43
James

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

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

25
Fatih Karatana

インポートドキュメント.. - 参照のためのリンク 

__init__.pyファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。これは、stringなどの共通名を持つディレクトリが、後でモジュール検索パスで発生する有効なモジュールを誤って隠すのを防ぐためです。

__init__.pyは、単に空のファイルにすることもできますが、パッケージの初期化コードを実行することも、__all__変数を設定することもできます。

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
15
Sanyal
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"ファイルがあなたの現在のディレクトリだけに存在することを確認してください。

7
Devendra Bhat

.pyファイルをインポートする最良の方法は__init__.pyによるものです。最も簡単な方法は、your.pyファイルと同じディレクトリに、__init__.pyという名前の空のファイルを作成することです。

mike Grouchyによるthis post は、__init__.pyと、pythonパッケージの作成、インポート、設定のためのその使用法の素晴らしい説明です。

4
supreme

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

import DoStuff.py as DS
DS.main()

忘れないで あなたのインポートファイル でなければならない .py拡張子で命名

3
Luke359

私はこのメモを付け加えたいと思います。モジュール/パッケージ内で、ファイルからロードするときは、モジュール/パッケージ名の前に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
3
Svend

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

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

インポートabc

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

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

  1. ケースabc.pyスクリプトは、フォルダー内にあるinternal_folderの内部で使用可能です

folder.internal_folder import abcから

  1. 上記のジェームズが答えたように、ファイルが固定された場所にある場合

輸入OS
システムのインポート
scriptpath = "../Test/MyModule.py"
sys.path.append(os.path.abspath(scriptpath))
MyModuleのインポート

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

%load_ext autoreload 
%autoreload 2
1
rishi jain

インポートしたいモジュールサブディレクトリではないの場合は、次を試して、最も深い共通の親ディレクトリから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にclientのパスを追加します。

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でも私のために働きます。

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拡張子を指定する必要はありません。

0
Sundar Gsv

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()
0
Farsheed

またこれをすることができます:from filename import something

例:from client import Client.py .pyw .pyui拡張子は必要ありません。

0
Lucas Soares

最初のケース:あなたはファイルA.pyにファイルB.pyをインポートしたいです、これらの2つのファイルはこのように同じフォルダーにあります:

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

これはファイルB.pyで行うことができます。

import A

そうすれば、ファイルA.py内のファイルB.pyのすべての機能を使用できるようになります。


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

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

ファイルBでこれを行うことができます。

import folder.A

そうすれば、ファイルA.py内のファイルB.pyのすべての機能を使用できるようになります。


概要:最初のケースでは、ファイルA.pyはファイルB.pyにインポートするモジュールです。構文import module_nameを使用しました。後者の場合、folderはモジュールA.pyを含むパッケージです。構文はimport package_name.module_nameを使用しました。

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

0
Bohao LI

上にリストしたように多くの方法がありますが、私は ファイルの内容をインポートしたいだけであることを見つけます そして行や行を書く必要がなく、インポートする必要がありません other modules。そこで、インポートしたファイルを自分のファイルとマージするのではなく、ドットシンタックス(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()

datastrクラスのインスタンスであるため、data.testStringにアクセスしようとするとエラーが発生します。また、プロパティtestStringがある場合でも、期待どおりには動作しません。
次に、クラスを作ります。例えば(意図した通り)、ImportedFile

    class ImportedFile:

そしてこれを(適切な字下げをして)それに入れる:

    exec(data)


そして最後に、dataを次のように再割り当てします。

    data=ImportedFile()

以上です!他のモジュールの場合と同じようにアクセスするだけで、print(data.testString)と入力するとコンソールA string literal to import and test withに出力されます。
ただし、from mod import *と同等のものが必要な場合は、単にクラス、インスタンスの割り当てを削除し、execを拒否してください。

お役に立てれば:)
- ベンジ

0
Benj

これは私が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)
0
Xiao-Feng Li

これはおかしく聞こえるかもしれませんが、ラッパースクリプトを作成するだけであれば、インポートするファイルへのシンボリックリンクを作成することができます。

0
Jonathan

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

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

関数をインポートするファイルに、これを書きます:

from x import greet

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

0
Sid