以下作品:
def spam():
print "spam"
exec(spam.__code__)
Run Code Online (Sandbox Code Playgroud)
垃圾邮件
但如果spam需要参数呢?
def spam(eggs):
print "spam and", eggs
exec(spam.__code__)
Run Code Online (Sandbox Code Playgroud)
TypeError:spam()只需1个参数(给定0)
鉴于,我无法访问函数本身,只能访问代码对象,如何在执行代码对象时将参数传递给代码对象?是否可以使用eval?
编辑:由于大多数读者往往不相信这有用,请参阅以下用例:
我想将小Python函数保存到文件中,以便可以从另一台计算机中调用它们.(这里不用说这个用例严格限制了可能的功能.)pickle函数对象本身不起作用,因为这只保存了定义函数的名称和模块.相反,我可以腌制__code__功能.当我再次取消它时,当然对函数的引用消失了,这就是我无法调用该函数的原因.我只是在运行时没有它.
另一个用例:
我在一个文件中处理几个函数,计算一些数据并将其存储在硬盘上.计算会耗费大量时间,所以我不想每次都执行这些函数,但只有在函数的实现发生变化时才会执行.
我有一个版本的运行整个模块而不是一个功能.它通过查看实现模块的文件的修改时间来工作.但是如果我有许多我不想在单个文件中分离的函数,那么这不是一个选项.
作为这个问题的后续问题: 是否有一种简单的方法来挑选python函数(或以其他方式序列化其代码)?
我想从上面的帖子中看到这个子弹的一个例子:
"如果函数引用了你需要选择的全局变量(包括导入的模块,其他函数等),你也需要对它们进行序列化,或者在远程端重新创建它们.我的例子只是给它了远程进程的全局命名空间. "
我有一个简单的测试,我正在使用marshal将函数字节代码写入文件:
def g(self,blah):
print blah
def f(self):
for i in range(1,5):
print 'some function f'
g('some string used by g')
data = marshal.dumps(f.func_code)
file = open('/tmp/f2.txt', 'w')
file.write(data)
Run Code Online (Sandbox Code Playgroud)
然后我开始一个新的python实例:
file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')
Run Code Online (Sandbox Code Playgroud)
这导致:
NameError: global name 'g' is not defined
Run Code Online (Sandbox Code Playgroud)
这与我所采用的不同方法无关.我尝试了基本相同的方法来发送g作为f但f仍然看不到g.如何进入全局命名空间,以便f在接收过程中可以使用它?
有人还建议将pyro作为如何执行此操作的示例.我已经尝试了解迪斯科项目中的相关代码.我拿了他们的dPickle类并尝试在独立应用程序中重新创建他们的disco/tests/test_pickle.py功能但没有成功.我的实验在使用转储调用执行函数编组时遇到了问题.无论如何,也许接下来就是热探索.
总之,我所遵循的基本功能是能够通过线路发送方法并将所有基本的"工作空间"方法与其一起发送(如g).
来自答案的更改示例:
工作函数编写者:
import marshal, types
def g(blah):
print blah
def f():
for i in range(1,5):
print 'some function f'
g('blah string used …Run Code Online (Sandbox Code Playgroud) 我有一个
AttributeError: '_MainProcess' object has no attribute '_exiting'
Run Code Online (Sandbox Code Playgroud)
来自Python应用程序.不幸的是,这段代码必须运行Python 2.5,因此processing现在称为模块multiprocessing.我正在做的是从主进程创建一个Process带有a Queue和到put队列中的项目.查看processing.queue代码,我可以看到启动了一个支线线程.然后currentProcess()._exiting,该馈线线程将进行检查,但是在模块中可以看到,currentProcess()评估为_MainProcess没有所述属性的线程processing.process.怎么解决这个?这是一个错误processing吗?如果是的话,我可以简单地使用它进行monkeypatch currentProcess()._exiting = False吗?
最小的例子:
#!/usr/bin/python
import processing
import processing.queue
class Worker(processing.Process):
def __init__(self):
processing.Process.__init__(self)
self.queue = processing.queue.Queue()
def run(self):
element = self.queue.get()
print element
if __name__ == '__main__':
w = Worker()
w.start()
# To trigger the problem, any non-pickleable object is to be passed here.
w.queue.put(lambda x: …Run Code Online (Sandbox Code Playgroud) 最近提出了一些关于试图通过使用pickle进程来促进分布式计算的Python代码的问题.显然,该功能在历史上是可行的,但出于安全原因,相同的功能被禁用.在第二次尝试通过套接字传输功能对象时,仅传输了引用.如果我错了,请纠正我,但我不相信这个问题与Python的后期绑定有关.鉴于假设进程和线程对象无法被pickle,有没有办法传输可调用对象?我们希望避免为每个作业传输压缩源代码,因为这可能会使整个尝试毫无意义.出于可移植性原因,只能使用Python核心库.
我构建了一个带有自定义距离度量的 knn 模型,即余弦距离:
def cosine_distance(x,y):
x_module = np.sqrt(np.sum(x**2))
y_module = np.sqrt(np.sum(y**2))
return 1-np.dot(x,y)/(x_module*y_module)
# load data
x_feature = load_npz('data/movie_features.npz').toarray()
movies = CSVHelper.read_movie('data/IMDB_Movies_Master_data.csv')
neigh = NearestNeighbors(n_neighbors=5, metric=cosine_distance)
neigh.fit(x_feature)
# save the k-means model
joblib.dump(neigh, 'knn.pkl')
Run Code Online (Sandbox Code Playgroud)
现在在第二个脚本中,我使用以下命令加载模型joblib:
knn_classifier = joblib.load('knn.pkl')
Run Code Online (Sandbox Code Playgroud)
但是,它会引发以下错误:
File "<stdin>", line 1, in <module>
File "/home/A/deeplearning_env/lib/python3.5/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 578, in load
obj = _unpickle(fobj, filename, mmap_mode)
File "/home/A/deeplearning_env/lib/python3.5/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 508, in _unpickle
obj = unpickler.load()
File "/usr/lib/python3.5/pickle.py", line 1039, in load
dispatch[key[0]](self)
File "/usr/lib/python3.5/pickle.py", line 1334, in load_global …Run Code Online (Sandbox Code Playgroud) python ×5
function ×2
eval ×1
exec ×1
pickle ×1
python-2.5 ×1
python-3.x ×1
scikit-learn ×1
scipy ×1