Python ファイルをインポートする方法はたくさんありますが、すべて長所と短所があります。
自分に合った最初のインポート戦略を急いで選択しないでください。そうしないと、後でコードベースがニーズを満たさないことがわかったときにコードベースを書き直す必要があります。
最も簡単な例 #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 をインポートし、what_does_the_fox_say()
fox.py 内から python 関数を呼び出しました。
例 2、スクリプトでexecfile
or ( exec
Python 3の場合) を使用して、他の 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、 from ... import ... 機能の使用:
これを /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 ライブラリ ライターによって悪用され、すべてのユーザー定義プログラムの前にコードをグローバル名前空間に無礼に挿入するために使用されたためです。これを 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 でファイルをインポートします。
- 新しいディレクトリを作成する
/home/el/foo5/
- 新しいディレクトリを作成する
/home/el/foo5/herp
__init__.py
herpという名前の空のファイルを作成します。
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 を参照してください。