在python脚本中运行我想要的所有包的方法

时间:2016-04-24 11:26:14

标签: python scipy

有很多次我想在我的脚本中使用相同的包,我主要从上一个脚本中复制粘贴包。我想停止这项工作并用一个简单的函数运行所有主题,今天我试试这个:

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'未定义

该代码有什么问题?无论如何定义函数来做到这一点?

4 个答案:

答案 0 :(得分: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 *

答案 1 :(得分: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文件在__init__.py包目录中为econometrics,然后通过以下方式将其安装为python包:

python setup.py install

在您的来源的根源。因此,您解决的任何代码都可以使用econometrics作为python包。您甚至可以考虑将它作为pypi上的包装!

HTH

答案 2 :(得分:0)

您已将包导入该函数的范围。如果要在global范围内使用它们,则必须告诉python

def importfunc():
    global np
    import numpy as np

importfunc()
print np.version.version

旁注:您使用的是某种工具链吗?我认为最好使用IDE或编写一个为您设置新项目的脚本。

答案 3 :(得分:0)

调用函数时会执行各种导入,但名称pdnp等是函数的本地名称,因此无法在函数外部引用它们。 / p>

我想你可以返回这些名字,但是在这样的函数中导入模块会让你的代码更难以让读者关注,恕我直言。