2012-09-13 73 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。

python有沒有類似的方法,把... some more code ...放到一個外部文件中,它將被簡單地讀爲好像它在文件中一樣被調用?

+1

是的,你可以在不同的模塊中分割你的文件並導入你需要的東西。 http://docs.python.org/tutorial/modules.html – Borgleader

+2

閱讀你最喜歡的Python教程,並瞭解模塊 –

回答

17

我正在研究python中的模塊用法,我想我會回答Markus在上述註釋中提出的問題(「如何在嵌入模塊時導入變量?「)從兩個角度:

  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」和「二傳手」的方法,使不需要將3210個變量複製到主程序中,
  • 要重新使用存儲在模塊中的變量,請初始化變量並使用 getter和setter函數。 setter函數將聲明 變量爲全局變量。
18

Python有導入和命名空間,這是很好的。在Python可以導入到當前的命名空間,如:

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

或者與命名空間:

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

「哪些很好」+1是一個很好的輕描淡寫。 – mgilson

34

當然!

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

現在,這個文件(「test.py」)是python術語中的一個「模塊」。 (只要它可以在我們PYTHONPATH找到),我們可以將其導入需要注意的是當前目錄總是在PYTHONPATH,所以如果use_test正在從那裏test.py的生活,你所有的設置同一個目錄下運行:

#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 

除了通過使用特殊的__init__.py文件,您還可以做更多的事情,這些文件允許您將多個文件作爲單個模塊處理),但是這會回答您的問題,我想我們會在其他時間將其餘時間留下。

+0

好吧,也許我的例子不太好。我希望能夠用我所有的變量來調用我的額外代碼。導入模塊對我無幫助,因爲我需要傳輸變量,不是嗎? – Markus

+1

變量也可以導入,雖然它不是很常見,你通常不想這麼做......(請參閱我的更新) – mgilson

2

您可以通過簡單地導入第二個文件來完成相同的操作,導入時頂層代碼將運行。我建議最好這是混亂的,而不是一個好的編程習慣。你會過得更好的組織代碼爲modules

例子:

F1.py:

print "Hello, " 
import f2 

F2.py:

print "World!" 

當運行:

python ./f1.py 
Hello, 
World! 

編輯澄清:我建議的部分是「雜亂」是使用import語句僅用於生成輸出的副作用,而不是創建單獨的源文件。

+0

如果我在循環中粘貼'import f2',它只會寫入'World! '一次。我可以改變它嗎? – Markus

+0

我會把'print'語句(在f2.py中)放入一個函數中,只導入一次文件並在循環中調用你的新函數。 –

+0

但這就是我遇到麻煩的地方,它需要在主代碼和「子代碼」中使用變量來調用實際代碼, – Markus