我试图使用Process对象在python中使用worker Pool.每个工作者(一个进程)进行一些初始化(花费非常重要的时间),传递一系列作业(理想情况下使用map()),并返回一些东西.除此之外不需要任何沟通.但是,我似乎无法弄清楚如何使用map()来使用我的worker的compute()功能.
from multiprocessing import Pool, Process
class Worker(Process):
def __init__(self):
print 'Worker started'
# do some initialization here
super(Worker, self).__init__()
def compute(self, data):
print 'Computing things!'
return data * data
if __name__ == '__main__':
# This works fine
worker = Worker()
print worker.compute(3)
# workers get initialized fine
pool = Pool(processes = 4,
initializer = Worker)
data = range(10)
# How to use my worker pool?
result = pool.map(compute, data)
Run Code Online (Sandbox Code Playgroud)
是一个工作队列的方式,或者我可以使用map()?
我试图找出确定是否obj可以执行操作的对象的不同方法之间的权衡do_stuff().据我了解,有三种方法可以确定这是否可行:
# Way 1
if isinstance(obj, Foo):
obj.do_stuff()
# Way 2
if hasattr(obj, 'do_stuff'):
obj.do_stuff()
# Way 3
try:
obj.do_stuff()
except:
print 'Do something else'
Run Code Online (Sandbox Code Playgroud)
哪种方法首选(以及为什么)?
我刚刚开始使用python mocking框架.我想计算方法被调用的次数,而不去除实际调用方法的影响.
例如,在这个简单的反例,我想既增加计数器和跟踪,它被称为:
import unittest
import mock
class Counter(object):
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
class CounterTest(unittest.TestCase):
def test_increment(self):
c = Counter()
c.increment()
self.assertEquals(1, c.count)
def test_call_count(self):
with mock.patch.object(Counter, 'increment') as fake_increment:
c = Counter()
self.assertEquals(0, fake_increment.call_count)
c.increment()
self.assertEquals(1, fake_increment.call_count)
# increment() didn't actually get called.
self.assertEquals(1, c.count) # Fails.
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
是否有可能mock在注册调用后强制调用mocked方法,或者只是表示我想保留模拟函数的效果?
我有jenkins在运行master.com,并希望有一个奴隶继续运行slave.com.然而,为了ssh到奴隶,我需要经历gateway.com.通常从我的普通帐户ssh到这台机器,我只需使用〜/ .ssh/config来设置ProxyCommand.
我在我的/var/lib/jenkins/.ssh/config文件中复制了这个设置:
Host slave.com
User felix
ProxyCommand ssh felix@gateway.com nc %h %p
Run Code Online (Sandbox Code Playgroud)
我为网关和从设备设置了公钥认证,这样从命令行我可以直接从ssh jenkins@master.com到felix@slave.com简单地做ssh slave.com.
不幸的是Jenkins似乎不尊重我的.ssh/config设置,并且连接超时(奴隶无法直接访问).Jenkins从属日志文件是:
java.io.IOException: There was a problem while connecting to slave.com:22
....
Caused by: java.net.ConnectException: Connection timed out
Run Code Online (Sandbox Code Playgroud)
我如何判断jenkins是否尊重我的.ssh/config文件?我是否错过了为jenkins配置master jenkins帐户或.ssh/config文件的步骤?
我们的 CI/CD 工作流的一部分使用 git 分支的名称标记 Docker 镜像。但是,docker 标签的有效字符集小于 git 分支名称的有效字符集。
作为一个非常简单的例子,分支名称bugfix/my_awesome_feature不是一个有效的标签:
docker build . -t image_name:$(git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)
失败,错误是“不是有效的存储库/标签:无效的参考格式”。
同样的,更复杂的分支名称:fix/bug#123,pr@123,等....
将 git 分支名称转换为有效的 docker 标签的最佳方法是什么?忽略或替换所有无效字符很好。
我正在寻找一种方法可视化我的存储库随时间的任意信息,这可能是一些依赖于版本的数字,例如:
可视化此信息的最佳方法是什么?
更具体地说,我正在使用mercurial并且理想地喜欢具有良好界面的东西,具有调整大小/滚动/等等... Jenkins的情节插件是体面但不是很好,但更重要的是,不可能可视化过去的数据(比如说,添加新指标后).
我知道如果函数接受,我可以将函数参数转换为字典**kwargs.
def bar(**kwargs):
return kwargs
print bar(a=1, b=2)
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
但是,情况恰恰相反?我可以将命名参数打包到字典中并返回它们吗?手动编码版本如下所示:
def foo(a, b):
return {'a': a, 'b': b}
Run Code Online (Sandbox Code Playgroud)
但似乎必须有更好的方法.请注意,我试图避免**kwargs在函数中使用(命名参数对于代码完成的IDE更有效).
是否有可能有鼻子只输出名称未能得到测试失败的简单和紧凑列表中的考试吗?
我已经想出如何丢弃捕获的标准输出:
nosetests -s
Run Code Online (Sandbox Code Playgroud)
但仍会打印失败的断言(例如,assertEqual打印预期值和实际值).理想情况下,我只想知道失败的文件和行.
我在 CMakeLists.txt 中指定一个测试,该测试运行可执行文件,并且应该查找特定输出( )PASS_REGULAR_EXPRESSION来确定成功。
由于二进制文件不会自行终止,因此我还想在一些TIMEOUT.
PASS_REGULAR_EXPRESSION如果 my出现在 之前,测试应该通过TIMEOUT,否则测试应该失败。
我的 CMakeLists.txt 看起来是谎言:
add_test(NAME sometest COMMAND my_binary)
set_tests_properties(sometest PROPERTIES
PASS_REGULAR_EXPRESSION "All systems go[.]"
TIMEOUT 10)
Run Code Online (Sandbox Code Playgroud)
不幸的是,有一个TIMEOUT 总是将测试标记为失败。是否可以指定一个非失败超时?
我想通过在版本控制下存储它们来在多台机器和平台上共享PyCharm运行配置。但是,我注意到运行配置XML文件包含平台相关的信息,即python解释器的完整路径:
File .idea/runConfigurations/job.xml:
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="job_name" type="tests" factoryName="Nosetests">
...
<option name="SDK_HOME" value="/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python" />
...
</configuration>
</component>
Run Code Online (Sandbox Code Playgroud)
如何在不保留完整的python解释器路径的情况下共享运行配置?
由于我通常尝试在matplotlib图中标记我的轴,我发现我经常使用以下内容单独标记x/y/z轴:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
# <plot plot plot>
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
Run Code Online (Sandbox Code Playgroud)
有没有办法将单个轴标签设置减少到一个命令,理想情况是这样的ax.set_labels(['x', 'y', 'z'])?
python ×7
jenkins ×2
unit-testing ×2
attributes ×1
axes ×1
cmake ×1
ctest ×1
dictionary ×1
docker ×1
dvcs ×1
git ×1
isinstance ×1
kwargs ×1
matplotlib ×1
mocking ×1
nosetests ×1
proxy ×1
pycharm ×1
ssh ×1