作成日
2013/07/22最終更新
2020/09/16記事区分
一般公開コードをファイル分割する場合、メインファイルでサブファイルをインポートする必要があります。
インポート可能なファイルは、
- サーチパスに含まれるディレクトリ直下のファイル (モジュールインポート)
- サーチパスに含まれるディレクトリ直下のディレクトリに含まれるファイル (パッケージインポート)
の2種類があります。
モジュールインポート
サーチパスには、
- メインファイルが存在するディレクトリ
- 環境変数$PYTHONPATHで指定されたディレクトリ
などがあります。以下では、メインファイルが存在するディレクトリにサブファイルが存在している場合の例を示しています。
import
ディレクトリ構成
$ tree .
.
|-- main.py
`-- sub.py
main.py
#!/usr/bin/python
import sub
print sub.x
sub.setX(256)
print sub.x
sub.x = 512
print sub.x
sub.py
x = 128
def setX(var):
global x
x = var
実行例
$ python main.py
128
256
512
実行後のディレクトリ構成 (バイトコンパイルされたsub.pycが生成されています)
$ tree .
.
|-- main.py
|-- sub.py
`-- sub.pyc
from import
C++などにおける、using namespaceに相当するインポート方法もあります。
ディレクトリ構成
$ tree .
.
|-- main.py
`-- sub.py
main.py
#!/usr/bin/python
from sub import setX,getX
setX(1024)
print getX()
sub.py
x = 128
def setX(var):
global x
x = var
def getX():
global x
return x
実行例
$ python main.py
1024
パッケージインポート
サブディレクトリ内のファイルをインポート (パッケージインポート) するためには、空の__init__.pyファイルを作成し、
ディレクトリのパス情報を含めたimportあるいはfrom import宣言を記述します。
ディレクトリ構成
$ tree .
.
|-- main.py
`-- my
|-- __init__.py
`-- sub.py
main.py
#!/usr/bin/python
import my.sub
print my.sub.x
my.sub.setX(256)
print my.sub.x
my.sub.x = 512
print my.sub.x
sub.py
x = 128
def setX(var):
global x
x = var
実行例
$ python main.py
128
256
512
実行後のディレクトリ構成
$ tree .
.
|-- main.py
`-- my
|-- __init__.py
|-- __init__.pyc
|-- sub.py
`-- sub.pyc
__init__.py
で import する書き方
__init__.py
に import 文が記載してある場合は、利用する際にディレクトリを指すように import することができます。
my/__init__.py
# -*- coding: utf-8 -*-
import my.sub
main.py
#!/usr/bin/python
import my # このように書ける
#import my.sub
print my.sub.x
my.sub.setX(256)
print my.sub.x
my.sub.x = 512
print my.sub.x
関連記事
- Python コードスニペット (条件分岐)if-elif-else sample.py #!/usr/bin/python # -*- coding: utf-8 -*- # コメント内であっても、ASCII外の文字が含まれる場合はエンコーディング情報が必須 x = 1 # 一行スタイル if x==0: print 'a' # 参考: and,or,notが使用可能 (&&,||はエラー) elif x==1: p...
- Python コードスニペット (リスト、タプル、ディクショナリ)リスト range 「0から10まで」といった範囲をリスト形式で生成します。 sample.py print range(10) # for(int i=0; i<10; ++i) ← C言語などのfor文と比較 print range(5,10) # for(int i=5; i<10; ++i) print range(5,10,2) # for(int i=5; i<10;...
- ZeroMQ (zmq) の Python サンプルコードZeroMQ を Python から利用する場合のサンプルコードを記載します。 Fixing the World To fix the world, we needed to do two things. One, to solve the general problem of "how to connect any code to any code, anywhere". Two, to wra...
- Matplotlib/SciPy/pandas/NumPy サンプルコードPython で数学的なことを試すときに利用される Matplotlib/SciPy/pandas/NumPy についてサンプルコードを記載します。 Matplotlib SciPy pandas [NumPy](https://www.numpy
- pytest の基本的な使い方pytest の基本的な使い方を記載します。 適宜参照するための公式ドキュメントページ Full pytest documentation API Reference インストール 適当なパッケージ