2016-04-24 55 views
1

有很多次我想在腳本中使用相同的軟件包,我主要是從我的上一個腳本中複製我想要的粘貼包。我想停止這項工作,並與一個簡單的函數運行所有的主題,今天我嘗試這個辦法:在python腳本中運行我想要的所有軟件包的方法

def econometrics(): 
    print("Econometrics is starting") 
    import pandas as pd 
    import numpy as np 
    import statsmodels.formula.api as smf 
    import statsmodels.api as sm 
    import matplotlib.pyplot as plt 
    print("Econometrics is started") 

econometrics() 

功能運行沒有錯誤,但如果我說了一些方法,從封裝,我得到的錯誤是這樣的: 名'plt'未定義

該代碼有什麼問題?反正有定義函數來做到這一點?

+0

事實上,模塊的工作就好了內部計量經濟學(),而不是外面的範圍。我奮鬥了同樣的工作,並決定創建我自己的工具箱模塊,以便我可以從tbx.acustics導入混響編碼,並從那裏獲得所有我想要的導入。 – krysopath

回答

7

該代碼有什麼問題?

簡單的答案:變量作用域。 plt(和其他)只能從econometrics方法中訪問。


嘗試製作一個文件,命名爲importer.py,例如

import pandas as pd 
import numpy as np 
import statsmodels.formula.api as smf 
import statsmodels.api as sm 
import matplotlib.pyplot as plt 

然後在你的其他代碼(即在同一目錄),

from importer import * 

使用的__init__.py雖然可能是推薦的方法,但不清楚你是否有模塊/包裝佈局,或不。

如果這樣做,那麼使用

相對進口(同一目錄):from . import *
絕對進口(使用模塊名):from some_module import *

+0

感謝板球我絕對有一個包裝佈局,我嘗試這個,我打電話給你什麼結果! – Mehdi

+0

我不會將它定義爲包的'__init __。py',而是一個簡單的'.py'模塊。 – zmo

+0

@zmo可能不是。我只是列出了一個選項 –

2

你的意圖是錯的Python的語法。因爲在你的代碼中,the variables range are scoped within the function。因此,當您進行導入時,您會在econometrics函數範圍內創建一堆變量,因此您的變量只能在該函數中達到。

那麼,讓我們來簡單的例子:

>>> def foobar(): 
... a = 1 
... b = 2 
... 
>>> foobar() 
>>> a 
NameError: name 'a' is not defined 

這裏ab只有foobar的功能範圍內的存在,所以它是超出範圍的主要範圍。

做你想做什麼,你想要的方式,你應該聲明的變量作爲belonging to the global scope

def econometrics(): 
    global pd, np, smf, sm, plt 
    print("Econometrics is starting") 
    import pandas as pd 
    import numpy as np 
    import statsmodels.formula.api as smf 
    import statsmodels.api as sm 
    import matplotlib.pyplot as plt 
    print("Econometrics is started") 

econometrics() 

所以要回了foobar例如:

>>> def foobar(): 
... global a, b 
... a = 1 
... b = 2 
... 
>>> foobar() 
>>> a 
1 
>>> b 
2 

雖然,我不太喜歡那種做事的方式,因爲它的做事含蓄。考慮到你有一個Python模塊只定義,人們閱讀下面的代碼的計量經濟學功能:

from econometrics import econometrics 
econometrics() 

plt.something() 

不會有必要明白,plt已可通過econometrics函數調用。添加評論將有所幫助,但仍然是不必要的額外步驟。

一般來說,doing globals within any language is wrong,這裏面的大部分總是時有更好的方式來做到這一點。內"Zen of python",更說明「明確優於隱式」,所以我相信一個更優雅的方式是創建一個模塊,做進口,然後你導入你的模塊需要的東西:

econometrics.py:

import pandas as pd 
import numpy as np 
import statsmodels.formula.api as smf 
import statsmodels.api as sm 
import matplotlib.pyplot as plt 

,並在你的代碼你然後導入只有你所需要的:

from econometrics import pd, plt 

plt.something() 

這將是更優雅的和明確的!然後,你只需要將該文件放在需要數學模塊的任何項目中,以便讓所有需要的心愛的模塊- 只有它們 - 可用於您的代碼!

然後爲一步,你可以定義你自己的Python模塊,with a full blown setup.py,並與您的econometrics.py文件是在econometrics包目錄__init__.py,到那麼它作爲一個Python包通過安裝:

python setup.py install 

位於源代碼的根目錄。那麼你的任何代碼都可以使用econometrics作爲python包。你甚至可以考慮在pypi上製作一個包裝!

HTH

+0

對,功能範圍,不封鎖,週日早上錯誤:-) – zmo

0

將包導入到函數的作用域中。如果你想在global範圍內使用它們,你必須告訴蟒蛇

def importfunc(): 
    global np 
    import numpy as np 

importfunc() 
print np.version.version 

在一個側面說明:您是否使用某種工具鏈?我認爲使用IDE或編寫一個爲您設置新項目的腳本會更好。

0

當您調用該函數時會執行各種導入,但函數名稱爲pd,np等是局部函數,因此它們不能在函數外引用。

我想你可以返回那些名字,但在那樣的功能導入模塊,使你的代碼有點難以讓讀者跟隨,恕我直言。

相關問題