Pythonに他のファイルをインポートする方法
import file.py
のような特定のpythonファイルをどの程度正確にインポートできますか?たとえば、main.py
では、次のようになります。
from extra import *
これはextra.py
の中のすべての定義を私に与えますが、たぶん私が欲しいのは単一の定義だけです:
def gap():
print
print
extra.py
からimport
を取得するためにgap
ステートメントに何を追加しますか?
importlib
はPythonでプログラム的にモジュールをインポートするための最近の追加です。それは__import__
のまわりのラッパーです。 https://docs.python.org/3/library/importlib.html#module-importlib を参照してください。
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
更新:以下の回答は古くなっています 。上記のより新しい代替手段を使用してください。
拡張子が '.py'のないimport file
だけです。
__init__.py
という名前の空のファイルを追加することで、フォルダーをパッケージとしてマークできます。
__import__
関数を使うことができます。モジュール名を文字列として取ります。 (繰り返しますが、 '。py'拡張子のないモジュール名)
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
詳細はhelp(__import__)
と入力してください。
自分に合った最初のインポート戦略を急いで選択しないでください。さもなければ、ニーズに合わないことがわかったときにコードベースを書き直す必要があります。
最も簡単な例#1の説明から始め、次に最も専門的で堅牢な例#7に進みます。
例1、pythonインタープリターを使用してpythonモジュールをインポートします:
これを/home/el/foo/fox.pyに入れます:
def what_does_the_fox_say():
print("vixens cry")
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ファイルの場所:
これを/home/el/foo2/mylib.pyに配置します。
def moobar():
print("hi")
これを/home/el/foo2/main.pyに配置します。
execfile("/home/el/foo2/mylib.py")
moobar()
ファイルを実行します:
el@apollo:/home/el/foo$ python main.py
hi
関数moobarはmylib.pyからインポートされ、main.pyで利用可能になりました
例3、...から使用...インポート...機能:
これを/home/el/foo3/chekov.pyに配置します。
def question():
print "where are the nuclear wessels?"
これを/home/el/foo3/main.pyに配置します。
from chekov import question
question()
次のように実行します。
el@apollo:/home/el/foo3$ python main.py
where are the nuclear wessels?
Chekov.pyで他の関数を定義した場合、import *
でない限り利用できません
例4、インポート先とは異なるファイルの場所にある場合はriaa.pyをインポートする
これを/home/el/foo4/stuff/riaa.pyに配置します。
def watchout():
print "computers are transforming into a noose and a Yoke for humans"
これを/home/el/foo4/main.pyに入れます:
import sys
import os
sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
from riaa import *
watchout()
それを実行します:
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コマンドでインポートします:
/home/el/foo5/
/home/el/foo5/herp
Herpの下に__init__.py
という名前の空のファイルを作成します。
el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.py
新しいディレクトリ/ home/el/foo5/herp/derpを作成します
Derpの下で、別の__init__.py
ファイルを作成します。
el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.py
/ 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!!"
真実の瞬間、新しいファイル/home/el/foo5/main.py
を作成し、そこに入れます。
from herp.derp.yolo import skycake
skycake()
それを実行します:
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
特定の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
Pythonファイルをあるフォルダから別のフォルダにインポートするための複雑な方法はあまり多くありません。 __init__.py ファイルを作成してこのフォルダがpythonパッケージであると宣言してから、インポートしたいHostファイルに移動します
from root.parent.folder.file import variable, class, whatever
インポートドキュメント.. - 参照のためのリンク
__init__.py
ファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。これは、stringなどの共通名を持つディレクトリが、後でモジュール検索パスで発生する有効なモジュールを誤って隠すのを防ぐためです。
__init__.py
は、単に空のファイルにすることもできますが、パッケージの初期化コードを実行することも、__all__
変数を設定することもできます。
mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
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"ファイルがあなたの現在のディレクトリだけに存在することを確認してください。
.pyファイルをインポートする最良の方法は__init__.py
によるものです。最も簡単な方法は、your.pyファイルと同じディレクトリに、__init__.py
という名前の空のファイルを作成することです。
mike Grouchyによるthis post は、__init__.py
と、pythonパッケージの作成、インポート、設定のためのその使用法の素晴らしい説明です。
インポート方法は、ファイルをインポートしてその名前の短縮形を使用することです。
import DoStuff.py as DS
DS.main()
忘れないで あなたのインポートファイル でなければならない .py拡張子で命名
私はこのメモを付け加えたいと思います。モジュール/パッケージ内で、ファイルからロードするときは、モジュール/パッケージ名の前に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
Abc.pyという名前のpythonスクリプトを含める方法はいくつかあります
インポートabc
フォルダからインポートabc
folder.internal_folder import abcから
輸入OS
システムのインポート
scriptpath = "../Test/MyModule.py"
sys.path.append(os.path.abspath(scriptpath))
MyModuleのインポート
pythonスクリプトが更新され、アップロードしたくない場合-これらのステートメントを自動更新に使用します。ボーナス:)
%load_ext autoreload
%autoreload 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に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でも私のために働きます。
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拡張子を指定する必要はありません。
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()
またこれをすることができます:from filename import something
例:from client import Client
.py .pyw .pyui
拡張子は必要ありません。
最初のケース:あなたはファイル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 を参照してください。
上にリストしたように多くの方法がありますが、私は ファイルの内容をインポートしたいだけであることを見つけます そして行や行を書く必要がなく、インポートする必要がありません 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()
data
はstr
クラスのインスタンスであるため、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
を拒否してください。
お役に立てれば:)
- ベンジ
これは私が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)
これはおかしく聞こえるかもしれませんが、ラッパースクリプトを作成するだけであれば、インポートするファイルへのシンボリックリンクを作成することができます。
定義された関数がファイルx.py
にある場合:
def greet():
print('Hello! How are you?')
関数をインポートするファイルに、これを書きます:
from x import greet
これは、ファイル内のすべての関数をインポートしたくない場合に便利です。