2012-09-13 1 views
26

私は複数のファイルに分割したいコードを持っています。 matlabでは、単に.mファイルを呼び出すことができ、特に何も定義されていない限り、呼び出されたコードの一部であるかのように実行されます。実施例(編集):
test.m(MATLAB)複数のファイルに分割されたpythonのソースコード?

function [] = test() 
    ... some code using variables ... 
    test2 

test2.m(MATLAB)

... some more code using same variables ... 

testを呼び出すと、テスト中のコードと同様のコードでの実行test2。

... some more code ...を外部ファイルに入れるのと同じ方法がありますが、それは単にそれが呼び出されたファイルにあるかのように読み込まれますか?

+1

はい、ありますが、別のモジュールでファイルを分割し、必要なものをインポートすることができます。 http://docs.python.org/tutorial/modules.html – Borgleader

+2

お気に入りのPythonチュートリアルを読んで、モジュールについて学んでください。 –

答えて

17

私は今Pythonでモジュールの使用法を研究しています。Markusが上記のコメントで尋ねる疑問に答えると思いました(「変数がモジュールに埋め込まれているときに変数をインポートする方法は?「)2つの観点から:。ここで

  1. 変数/関数、および
  2. クラスプロパティ/メソッド

は、私はマルクスのための変数の再利用性を実証するために、メインプログラムf1.pyを書き換えるだろうかです:ここで

import f2 
myStorage = f2.useMyVars(0) # initialze class and properties 
for i in range(0,10): 
    print "Hello, " 
    f2.print_world() 
    myStorage.setMyVar(i) 
    f2.inc_gMyVar() 
print "Display class property myVar:", myStorage.getMyVar() 
print "Display global variable gMyVar:", f2.get_gMyVar() 

は、私は、再利用可能なモジュールf2.pyを書き換える方法は以下のようになります

# Module: f2.py 
# Example 1: functions to store and retrieve global variables 
gMyVar = 0 
def print_world(): 
    print "World!" 
def get_gMyVar(): 
    return gMyVar # no need for global statement 
def inc_gMyVar(): 
    global gMyVar 
    gMyVar += 1 

# Example 2: class methods to store and retrieve properties 
class useMyVars(object): 
    def __init__(self, myVar): 
     self.myVar = myVar 
    def getMyVar(self): 
     return self.myVar 
    def setMyVar(self, myVar): 
     self.myVar = myVar 
    def print_helloWorld(self): 
     print "Hello, World!" 

f1.pyがここで実行される出力は次のようになります。

%run "f1.py" 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Display class property myVar: 9 
Display global variable gMyVar: 10 

私はマルクスにポイントがあることだと思う:

  • 回以上のモジュールのコードを再利用するには、モジュールのコードを 関数またはクラスに入れよう
  • モジュール内のプロパティとして保存された変数を再利用するには、クラス内の プロパティを初期化し、「getter」メソッドと「setter」メソッドを追加します。メインプログラムに3210変数をコピーする必要はありません。
  • モジュールに格納されている変数を再利用するには、変数を初期化して ゲッターとセッター関数を使用します。セッター関数は、 変数をグローバルとして宣言します。
18

Pythonにはインポートとネームスペースがあります。

>>> from test import disp 
>>> disp('World!') 

または名前空間を持つ:

>>> import test 
>>> test.disp('World!') 
+11

「どれがいいですか」は、非常に素敵な控えめな記述です。 – mgilson

34

確かにPythonでは、あなたは次のように、現在の名前空間にインポートすることができます!

#file -- test.py -- 
myvar = 42 
def test_func(): 
    print("Hello!") 

ここで、このファイル( "test.py")は、Pythonの用語で「モジュール」です。我々は(それが私たちのPYTHONPATHで見つけることができる限り)、それをインポートtest.py生活は、あなたがすべてセットしている同じディレクトリから実行されているuse_testので、もしカレントディレクトリが、PYTHONPATHに常にあることに注意してくださいすることができます

#file -- use_test.py -- 
import test 
test.test_func() #prints "Hello!" 
print (test.myvar) #prints 42 

from test import test_funC#Only import the function directly into current namespace 
test_func() #prints "Hello" 
print (myvar)  #Exception (NameError) 

from test import * 
test_func() #prints "Hello" 
print(myvar)  #prints 42 

複数のファイルを1つのモジュールとして扱う特別な__init__.pyファイルを使用することで、それ以上に多くのことができますが、これはあなたの質問に答えて、私は別の時間。

+0

まあ、私の例はあまり良くないかもしれません。私は私のすべての変数で、私の余分なコードを呼び出すことができるようにしたい。変数を転送する必要があるので、モジュールをインポートしても大したことはありませんか? – Markus

+1

変数はインポートすることもできますが、それほど一般的ではないし、通常はやりたくありません。(私の更新を参照してください) – mgilson

2

Pythonでは、2番目のファイルをインポートするだけで同じことができます。トップレベルのコードはインポート時に実行されます。私はこれがせいぜい乱雑で、良いプログラミングの練習ではないことをお勧めします。実行すると

print "World!" 

F1.py:

print "Hello, " 
import f2 

F2.pyあなたはmodules

例にコードを整理したほうが良いでしょう

python ./f1.py 
Hello, 
World! 

明確にするために編集:私が提案していた部分は、「混乱している」というのは、別々のソースファイルを作成するのではなく、出力を生成する副作用についてのみimportステートメントを使用していることです。

+0

'import f2'をループ内に置くと' World! "一度。何とか変更することはできますか? – Markus

+0

関数に 'print'ステートメント(f2.pyで)を置くと、ファイルを一度だけインポートし、ループ内で新しい関数を呼び出します。 –

+0

しかし、それは私が問題に遭遇するところで、メインコードと "サブコード"に必要な変数を使って実際のコードを呼び出すのです – Markus

関連する問題