2016-04-24 2 views
1

Es gibt viele Male, dass ich die gleichen Pakete in meinen Skripts verwenden möchte, ich kopiere meist Paste-Pakete, die ich von meinem letzten Skript wollen. Ich möchte diese Arbeit beenden und ich alle Thema mit einer einfachen Funktion, Heute laufen versuchen Sie dies:Möglichkeit, alle Pakete, die ich in Python-Skript ausführen möchte

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() 

die Funktion läuft ohne Fehler, aber wenn ich eine Methode von Paketen rufen, bekomme ich Fehler wie folgt aus: Name 'plt' ist nicht definiert

Was ist falsch an diesem Code? Gibt es da sowieso eine funktion, um das zu tun?

+0

In der Tat funktionieren die Module innerhalb von econometrics() gut, aber nicht außerhalb ihres Geltungsbereichs. Ich habe mit der gleichen Arbeit gekämpft und mich entschieden, ein eigenes Toolbox-Modul zu erstellen, damit ich von tbx.acustics import reverb 'codiere und alle meine gewünschten Importe von dort bekomme. – krysopath

Antwort

7

Was ist falsch an diesem Code?

Einfache Antwort: Variabler Bereich. plt (und die anderen) sind nur innerhalb der econometrics Methode zugänglich.


Versuchen Sie, eine Datei mit dem Namen importer.py zum Beispiel

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

dann in der anderen Code (das im selben Verzeichnis ist),

from importer import * 

eine Verwendung __init__.py ist wahrscheinlich der empfohlene Weg, um dies zu erreichen, aber es war nicht klar, ob Sie ein Modul haben/Paket-Layout oder nicht.

Wenn Sie das tun, dann

verwenden

Relative Import (Verzeichnis): from . import *
Absoluter Import (Verwendung Modulname): from some_module import *

+0

danke cricket Ich habe absolut ein Paket Layout, ich versuche das und ich rufe dich an was ist das Ergebnis! – Mehdi

+0

Ich würde das nicht als "__init __. Py" eines Pakets definieren, sondern als einfaches '.py' Modul. – zmo

+0

@zmo Wahrscheinlich nicht. Ich habe nur als eine Option aufgeführt –

2

Ihre Absicht ist es in Python Grammatik falsch. Weil in Ihrem Code the variables range are scoped within the function. Wenn Sie also Ihre Importe ausführen, erstellen Sie eine Reihe von Variablen innerhalb des Funktionsbereichs econometrics, und daher sind Ihre Variablen nur innerhalb dieser Funktion erreichbar. So

, lassen Sie uns ein einfacheres Beispiel nehmen:

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

hier a und b nur existieren innerhalb foobar ‚s Funktionsumfang, so dass es außerhalb des Gültigkeitsbereichs im Hauptbereich.

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() 

Also, um wieder auf das foobar Beispiel:

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

Obwohl ich

zu tun, was Sie wollen, wie Sie es wollen, sollten Sie Ihre Variable als belonging to the global scope erklären mag diese Art, Dinge zu tun, nicht wirklich, da es Dinge macht implizit.Erwägen Sie ein Python-Modul mit nur der Ökonometrie Funktion definiert, die Menschen den folgenden Code zu lesen:

from econometrics import econometrics 
econometrics() 

plt.something() 

wäre nicht notwendig zu verstehen, dass plt durch den econometrics Funktionsaufruf zur Verfügung gestellt wurde. Hinzufügen eines Kommentars würde helfen, ist aber immer noch ein unnötiger zusätzlicher Schritt.

Im Allgemeinen doing globals within any language is wrong, und es gibt die meiste Zeit immer einen besseren Weg, es zu tun. Innerhalb der "Zen of python" wird festgestellt, dass "Explizite ist besser als implizit", so glaube ich, eine elegantere Möglichkeit wäre, ein Modul zu erstellen, das den Import ausführt, und dann importieren Sie, was Sie aus dem Modul benötigen:

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 

und in Ihrem Code würden Sie dann nur importieren, was Sie brauchen:

from econometrics import pd, plt 

plt.something() 

, die viel eleganter und expliziter wäre! Dann müssten Sie diese Datei einfach in alle Projekte einfügen, in denen Sie Ihre Mathematikmodule benötigen, um alle Ihre geliebten Module zu haben, die benötigen - und nur sie - in Ihrem Code verfügbar sind!

Dann, als ein Schritt weiter, könnten Sie Ihr eigenes Python-Modul definieren, with a full blown setup.py und mit Ihrer econometrics.py Datei ein __init__.py im econometrics Paketverzeichnis zu sein, um sie dann als Python-Paket durch installiert haben:

python setup.py install 

an der Wurzel Ihrer Quellen. Also kann jeder Code, den Sie ausarbeiten, econometrics als Python-Paket verwenden. Sie könnten sogar darüber nachdenken, es zu einem Paket auf Pypi zu machen!

HTH

+0

rechts, funktion bereich, nicht block, sonntag morgen fehler :-) – zmo

0

Sie haben die Pakete in den Gültigkeitsbereich der Funktion importiert. Wenn Sie sie in den global Umfang nutzen möchten, müssen Sie Python

def importfunc(): 
    global np 
    import numpy as np 

importfunc() 
print np.version.version 

Auf einer Seite zur Kenntnis sagen: Sind Sie eine Art von Werkzeugkette mit? Ich denke, es wäre besser, eine IDE zu verwenden oder ein Skript zu schreiben, das neue Projekte für Sie aufstellt.

0

Die verschiedenen Importe werden ausgeführt, wenn Sie die Funktion aufrufen, aber die Namen pd, np usw. sind lokal für die Funktion und können daher nicht außerhalb der Funktion referenziert werden.

Ich nehme an, Sie könnten diese Namen zurückgeben, aber das Importieren von Modulen in einer solchen Funktion macht Ihren Code etwas schwieriger für Leser, IMHO.

Verwandte Themen