相关疑难解决方法(0)

Python:如何将参数传递给函数的__code__?

以下作品:

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 eval function exec parameter-passing

24
推荐指数
4
解决办法
9193
查看次数

如何使用依赖项来挑选python函数?

作为这个问题的后续问题: 是否有一种简单的方法来挑选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)

python function pickle

15
推荐指数
2
解决办法
1万
查看次数

AttributeError:'_ MainProcess'对象没有属性'_exiting'

我有一个

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)

python multiprocessing python-2.5

12
推荐指数
1
解决办法
1162
查看次数

我们需要腌制任何类型的可调用

最近提出了一些关于试图通过使用pickle进程来促进分布式计算的Python代码的问题.显然,该功能在历史上是可行的,但出于安全原因,相同的功能被禁用.在第二次尝试通过套接字传输功能对象时,仅传输了引用.如果我错了,请纠正我,但我不相信这个问题与Python的后期绑定有关.鉴于假设进程和线程对象无法被pickle,有没有办法传输可调用对象?我们希望避免为每个作业传输压缩源代码,因为这可能会使整个尝试毫无意义.出于可移植性原因,只能使用Python核心库.

python distributed-computing

9
推荐指数
1
解决办法
2995
查看次数

使用自定义距离指标保存 sklearn 模型

我构建了一个带有自定义距离度量的 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 machine-learning scipy python-3.x scikit-learn

5
推荐指数
0
解决办法
666
查看次数