2016-03-26 4 views
3

変数の接頭辞を除いて全く同じPythonスクリプトをいくつか実行しています。 (わかりやすくするために、私はTweepyとTwitter APIを使って作業しています)。'x import *'からの呼び出し方法xはPythonの変数です

私は各APIの資格情報にxx_apicred.py,yy_apicred.pyなどと名前を付けました。これらはフォルダ内に別個のファイルとして保存されています。

また、私はテーブルxx_info,yy_infoなどを持っています。この部分は、文字列の操作によって簡単に変更することができます。

これを変更して、xx文字列を引数として渡すファイルの1つにしたいと考えています。これは私が文字列変数に置き換えるとき、私はImportError: No module named 'var'

私は変数を介してインポートすることができる方法があるというエラーが出るfrom xx_cred import*

以外のすべてのために働きますか?

答えて

2

これは、モジュール名などの文字列を可能にする:

implが選ばれた実装 'xx'または 'yy'ある
import importlib 

cred = importlib.import_module('{}_cred'.format(impl)) 

。あなたが本当にfrom module import *使用の効果をしたい場合は

cred.module_var 

variables = {name: value for name, value in vars(cred).items() 
      if not name.startswith('__')} 
globals().update(variables) 

複数のPythonライブラリは次のように使用し、このトリック(竜巻、rethinkdb ...)

を使用します

しかし、import *ではなく、が推奨されます。

+0

これを試しましたが、モジュールが見つかりませんでした。私は 'import cred'を試してみたところ、' cred'モジュールは見つからなかった – pekasus

+0

もう一度インポートしようとしないでください。モジュールとして 'cred'を使うだけです。 –

+0

恐ろしい!できます。ありがとう! 'xx import *'を実行する方法はありますか?それとも 'cred.variable'を毎回インクルードする必要がありますか? – pekasus

0

余分FYIのみベストアンサーに選ばれたことがないこれは、DBの内部で、そのループに基づいて、ユーザが設定入力しない再考する方法です

def set_loop_type(library): 
    global connection_type 

    # find module file 
    moduleName = 'net_%s' % library 
    modulePath = None 
    driverDir = os.path.realpath(os.path.dirname(__file__)) 
    if os.path.isfile(os.path.join(driverDir, library + '_net', moduleName + '.py')): 
     modulePath = os.path.join(driverDir, library + '_net', moduleName + '.py') 
    else: 
     raise ValueError('Unknown loop type: %r' % library) 

    # load the module 
    moduleFile, pathName, desc = imp.find_module(moduleName, [os.path.dirname(modulePath)]) 
    module = imp.load_module('rethinkdb.' + moduleName, moduleFile, pathName, desc) 

impが便利ですPythonライブラリを活用することもできます。

+0

'imp'のドキュメントから:*ほとんどの場合、このモジュール上で' importlib'モジュールの機能を使用することをお勧めします* –

+0

RethinkDBの開発者にそれを伝えてください;インプラントがより良い鋭いケース。 –

+0

'importlib':*バージョン3.1の新機能*およびバージョン2.7の新機能*。だから、このRethinkDBコードは、おそらくこれより前のものです。 –

2

まず、from module import *は実際のコードでは悪い習慣とみなされます。インタプリタセッションを簡単にするのは本当に単なるトリックです。 from module import a, bまたはimport module; module.a()のいずれかです。

あなたが本当に動的に現在のグローバル名前空間にモジュール内のすべての名前を持参する場合は、あなたがこれを行うことができます:

import importlib 

module = importlib.import_module('module') 
globs = globals() 
for key, value in vars(module).items(): 
    if key not in globs: 
     globs[key] = value 

これは仕事とあなたがIDEなどのmodule修飾されていないが、ツールのメンバーを使用できるようになりますこの魔法を理解できず、あなたの変数が未定義であるとは思わないでしょう(これはコードが実行されるのを止めるわけではなく、単に「エラー」で強調表示されます)。修飾されたバージョンのエイリアスとして必要な変数を手作業で作成するほうがずっと良いでしょう。variable = cred.variable

+0

inspect + globals対エレガントgetattr –

+1

@Apero私はこの問題を解決するために 'getattr'を使うことをどう提案していますか?あなたはあなたの答えに言及していません。私の答えはOPの質問に実際に答える唯一の答えです(私は彼の質問が悪い考えであると彼に警告しましたが)。モジュールオブジェクトを取得することは、モジュール内の値の名前を修飾する必要があるので、その要素のすべてをインポートすることと同じではありません。 –

+0

私の答えはちょうど答えではありませんでした。私はモジュールのインポート*の熟達者ではないし、私はいつもモジュールをimportしてからmodule.somethingを行う。もしOPが同じことをしていたら、単純なgetattrは彼のように簡単にするでしょうが、彼は単にmodule.somethingを実行し、選択された答えによってアドバイスされたモジュールを動的にロードするだけです。 –

関連する問題