2017-12-11 17 views
3

私は非常に奇妙な問題にぶつかります。インポートで非常に奇妙な問題

編集:詳細を追加:

virtualenv -p python3 testenv 
cd testenv 
source bin/activate 
django-admin startproject blah 
cd blah 
mkdir modules 
vi modules/stash.py 
pip install django 
pip install stashy 
python manage.py shell < modules/stash.py 

私はデータベースを作成するデータを同期するスクリプトがあります。

$ python manage.py shell < modules/stash.py 

$ cat modules/stash.py 
import stashy 
class SyncProject: 
    def __init__(self, endpo, user, passw): 
     import stashy 
     self.stash = stashy.connect(endpo, user, passw) 

access = SyncProject("http://localhost", "test", "test") 

を私は私のスクリプトを実行します奇妙なことは、もし私が第二のimport stashyを置かなければ、それは働かないということです:

非常に予想外のようで、一つ一つの方法でインポートを追加するために私を強制的に、私は長い時間前にやったのPythonのビットから、
NameError: name 'stashy' is not defined 

は...わからない私は私の依存関係をインポートするか、どのように間違ったものがある場合私は、スクリプトを実行する方法...

編集:詳細は、エラーメッセージ:

Traceback (most recent call last): 
    File "manage.py", line 15, in <module> 
    execute_from_command_line(sys.argv) 
    File "/[PATH]/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line 
    utility.execute() 
    File "/[PATH]/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/[PATH]/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/[PATH]/python3.6/site-packages/django/core/management/base.py", line 335, in execute 
    output = self.handle(*args, **options) 
    File "/[PATH]/python3.6/site-packages/django/core/management/commands/shell.py", line 92, in handle 
    exec(sys.stdin.read()) 
    File "<string>", line 6, in <module> 
    File "<string>", line 4, in __init__ 
NameError: name 'stashy' is not defined 
+4

まず、インデントを修正します。次に、完全なスクリプトを投稿します。あなたのSyncProjectクラスをインスタンス化するものは何もないので、これは問題の原因にはなりません。 –

+0

SyncProject(...)の呼び出しで更新されました – ffyns

+3

インデントを修正する必要があります。 – solarissmoke

答えて

0

パッケージでconnect機能が唯一のラッパーである(次のように)

__version__ = "0.1" 

from .client import Stash 

def connect(url, username, password, verify=True): 
    """Connect to a Stash instance given a username and password. 
    This is only recommended via SSL. If you need are using 
    self-signed certificates, you can use verify=False to ignore SSL 
    verifcation. 
    """ 
    return Stash(url, username, password, verify=verify) 

__all__ = ['connect'] 

あなたはスタッシュオブジェクト自体を抽出して、エラーを回避しようとすることができます:

from stashy.client import Stash 

class SyncProject: 
    def __init__(self, endpo, user, passw): 
     self.stash = Stash(endpo, user, passw, verify=True) 
+0

問題は私が持っているすべての依存関係で起こります。だから、それは本当の問題を解決しません。 – ffyns

+0

これを質問に追加してください。エラーを再現できない場合は、お手伝いできません。 –

0

私は私の最後で同じ問題を再現しています。私は問題に言及したステップごとに試しました。私も同じ問題があります。

その後、私はdjango == 1.10をインストールしました。そして、それは動作します。それがあなたのために働くことを確認します。

+0

申し訳ありませんが、私は本当に古くなった依存関係を持つ新しいプロジェクトを開始したくありません – ffyns

1

Djangoプロジェクトの動作をline 92にトラッキングしました:exec(sys.stdin.read())

これにより、最初にimport stashyCommandクラスにスコープされます。代わりにその行がexec(sys.stdin.read(),globals())だった場合、この予期しない動作は発生しません。 Djangoのこの変更により、stdinにリダイレクトされたコードとDjangoシェル/ Python REPLに手動で入力されたコードとの間の現在のバグ/動作の違いが取り除かれます。

+0

インターネットの見知らぬ人ありがとう! – ffyns

+0

修正を入手しようとしました:https://github.com/django/django/pull/9464 – ffyns