1042

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

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

たとえば、main.py次のようなものがあります。

from extra import * 

これにより、 のすべての定義が得られますが、必要なextra.pyのは単一の定義だけである可能性があります。

def gap():
    print
    print

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

4

23 に答える 23

1262

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、スクリプトでexecfileor ( 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 startuphook をピギーバックしてファイルをインポートします。

更新:この例は、以前は 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 を使用していることを意味し、スタートアップフックはデフォルトで無効になっています。

この jist の功績は次のとおりです : https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py

例 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.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 を参照してください。

于 2013-12-23T18:46:10.163 に答える
517

importlibプログラムでモジュールをインポートするために Python 3 に追加されました。

import importlib

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

.py 拡張子は から削除する必要がありますmoduleNamepackageこの関数は、相対インポートの引数も定義します。

Python 2.x の場合:

  • .pyimport file拡張子なしで
  • __init__.py空のファイルを追加することで、フォルダをパッケージとしてマークできます
  • __import__モジュール名(拡張子なし)を文字列拡張子として受け取る関数を使用できます
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))

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

于 2010-02-28T03:42:33.213 に答える
89

「実行時」に特定の 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
于 2013-04-30T12:30:38.733 に答える
36

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

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

于 2013-01-24T14:08:54.513 に答える
24

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

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

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
于 2015-10-02T08:27:54.797 に答える
17

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

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

関数をインポートするファイルに、次のように記述します。

from x import greet

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

于 2019-08-17T12:11:56.807 に答える
6

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

import DoStuff.py as DS
DS.main()

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

于 2016-05-09T09:01:49.647 に答える
6
import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization

.py ファイルをインポートするには、上記のコードを使用できます。

最初にパスを追加してからインポートします

注:「../input/tokenization」ディレクトリには tokenization.py ファイルが含まれています

于 2021-07-01T18:13:33.547 に答える
6

他の場所ではあまり明確ではないこのメモを追加したいと思います。モジュール/パッケージ内で、ファイルからロードする場合、モジュール/パッケージ名の前に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
于 2018-04-18T09:51:57.297 に答える
4

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

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

abc をインポート

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

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

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

from folder.internal_folder import abc

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

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

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

%load_ext autoreload 
%autoreload 2
于 2019-07-29T14:13:16.400 に答える