在python中导入一个带参数的模块

tur*_*ing 12 python python-module python-import mcmc pymc

是否可以在python中传递带有一些参数的模块?

所有我的意思是参数是模块中存在一个未在该模块中初始化的变量,我仍然在该模块中使用该变量.简而言之,我希望行为类似于函数,但与函数不同,我希望模块的变量在调用代码中公开.

例如

a.py

#lists like data, count, prob_distribution are constructed from training_pool (not initialized in this file)
x = pymc.Uniform('x', lower = 0, upper = 1)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]
Run Code Online (Sandbox Code Playgroud)

b.py

import a  #I want some way tr pass value of training_pool
m = pymc.MCMC(a)
Run Code Online (Sandbox Code Playgroud)

我希望a.py中的所有随机变量都暴露给MCMC.我对我手头的问题采取了更好的方法,但我也想知道在python中是否可以传递模块的参数

otu*_*tus 9

无法将参数传递给模块。但是,您可以在第三个模块中使用全局变量:

# a.py
parameter = None
Run Code Online (Sandbox Code Playgroud)
# b.py
import a
a.parameter = 4
import c
Run Code Online (Sandbox Code Playgroud)
# c.py
import a
# use a.parameter
Run Code Online (Sandbox Code Playgroud)

当然,这只有在没有其他东西导入 c 的情况下才有效,因为模块只导入一次。


Abr*_*man 6

正如@otus已经回答,没有办法将参数传递给模块.

我想您正在关注PyMC2的一些介绍性示例,它们使用模式,其中模块包装贝叶斯模型中节点的所有代码.这种方法很适合入门,但是,正如您所发现的那样,当您想要运行具有各种变化的模型时,这可能会受到限制.

幸运的是,PyMC2可以从列表或字典以及模块创建MCMC对象.在这种情况下我推荐的是@ oleg-s在评论中建议的:使用函数.您可以结束该函数return locals()以获取模块中已存在的所有内容的字典,这是pymc.MCMC构造函数的合适输入.这是一个例子:

# a.py
from pymc import *

count = [10, 10] # perhaps good to put this stuff in data.py
prob_distribution = [[.5, .5], [.1, .2, .7]]
data = [[2, 8], [2, 3, 5]]

def model(training_pool):
    x = Uniform('x', lower = 0, upper = 1)
    rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in training_pool ]

    return locals()
Run Code Online (Sandbox Code Playgroud)
# b.py
import pymc, a

training_pool = [0]
m = pymc.MCMC(a.model(training_pool))
Run Code Online (Sandbox Code Playgroud)


小智 6

有多种方法可以做到这一点,这里只是一个愚蠢而简单的方法:

主文件

"""A silly example - main supplies a parameter
"""

import sys,os

print os.path.basename(__file__)+":Push it by: --myModuleParam "+str(123)
sys.argv.append('--myModuleParam')
sys.argv.append(123)
import module


print os.path.basename(__file__)+":Pushed my  param:"+str(module.displayMyParam)
Run Code Online (Sandbox Code Playgroud)

模块.py

"""A silly example - module consumes parameter
"""

import sys,os

displayMyParam = 'NotYetInitialized'

for px in sys.argv:
    if px == '--myModuleParam':
        idx = sys.argv.index(px)
        sys.argv.pop(idx) # remove option
        displayMyParam = sys.argv[idx]
        sys.argv.pop(idx) # remove value
        print os.path.basename(__file__)+":Got my param:"+str(displayMyParam)

#
# That's it...
#
Run Code Online (Sandbox Code Playgroud)


Jos*_*der 6

我发现定义全局变量很有帮助,并允许通过 init 函数设置这些变量。

def init(config_filename=CONFIG_FILENAME):
    config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
    config.read(config_filename)

    global YEARS
    YEARS = config['DEFAULT']['YEARS']
    global FEATURES
    FEATURES = config['DEFAULT']['FEATURES']
Run Code Online (Sandbox Code Playgroud)

然后用户所要做的就是记住在使用这些方法之前初始化模块:

import module
module.init('config.ini')
Run Code Online (Sandbox Code Playgroud)

请注意,我不会在我希望公开传播的模块上使用它。这更适合我个人使用的单文件模块。