为什么在python ssh子进程

时间:2017-04-10 15:23:02

标签: python numpy ssh subprocess popen

我需要一个执行文件的算法' test.py'在不同的计算机上同时(具有不同的参数),并且在每台计算机上,矢量化的方法,例如,从numpy包中,应该可以使用多个核心。

最小的(不工作)示例包含以下两个文件。

文件A:test.py

import numpy
import os     #to verify whether process is allowed to use all cores
os.system("taskset -p 0xff %d" % os.getpid())   
a = numpy.random.random((10000,10000))   #some random matrix
b = numpy.dot(a,a)                       #some parallelized calculation

和文件B:control.py

import subprocess
import os
callstring = "python " + str(os.getcwd()) + "/test.py" # console command to start test.py
sshProcess = subprocess.Popen(str("ssh <pc-name>"),
                              stdin=subprocess.PIPE,
                              shell=True)
sshProcess.stdin.write(str(callstring))    # start file.py
sshProcess.stdin.close()

现在,当我运行control.py时,文件test.py正在执行,但是只有一个核心。

如果我直接从控制台python test.py(我不想要)运行test.py,则会使用多个核心。

不幸的是,我是子进程扩展的新手,而且我也不是Linux系统的专家。但是,到目前为止,我能够获得以下知识:

  • 使用subprocess.call("python test.py", shell=True)会起作用,即使用多个核心。但是,我需要ssh来解决其他计算机问题。
  • 手动使用控制台,即通过ssh到另一台计算机并运行python test.py也会产生所需的结果:使用多个核心。但是,我需要自动完成这一步骤,因此,我想创建多个这样的ssh-consoles&#39;用python代码。
  • 核心亲和力似乎不是问题(它是一个典型的numpy问题),因为os.system("taskset -p 0xff %d" % os.getpid())产生输出&#39;当前亲和力ff,新亲和力ff&#39; = 8个可能的核心

因此,似乎是Popen与ssh结合的问题!?

您有任何想法或建议吗?谢谢你的帮助!

EDIT / ADDENDUM:我发现包“多处理”的并行化方法可以运行多个核心。所以它似乎再次成为一个尴尬的问题。我为之前没有测试过而道歉!

我正在使用Python 2.7.12和Numpy 1.11.1

1 个答案:

答案 0 :(得分:1)

我可以解决我的问题:

由于某种原因,我仍然没有理解 - 正如我所说,我的Linux知识是一种灾难 - 在上述Popen环境中调用不同的python

在控制台中,var username = User.Identity.Name; 给出'../anaconda2/bin/python',但which python给出'/ usr / bin / python'。

Anaconda似乎使用MKL库进行并行计算,这对于/ usr / bin中的python来说是未知的。

所以问题的根源是使用ssh而不知道它的作用。同样的问题已经出现: Why does an SSH remote command get fewer environment variables then when run manually?

再次感谢您的关注。