子进程缺少输出文件

时间:2017-10-13 19:03:02

标签: macos subprocess jupyter-notebook popen

我是python的新手,但我正在努力学习。

我想使用subprocess命令运行一个模拟程序,我可以在bash环境中调用终端。语法很简单:     命令inputfile.in 命令中的哪个位置是tcltk环境中的更大仿真脚本。

好的我已经阅读了很多python文献,并决定使用subprocess命令的Popen功能。

所以根据我的理解,我应该能够按如下方式格式化命令:

   p= subprocess.Popen(['command','inputfile.in'],stdout= subprocess.PIPE])
  print(p.communicate())

此命令的输出是两个文件。当我在终端中运行命令时,我在与原始输入文件相同的目录中获得两个文件。

File1.fid  File2.spe. 

当我使用Popen时,有两件事让我感到困惑。 (1)我没有将任何输出文件写入输入文件的目录。 (2)存在值p.communicate,表示模拟已运行。

输出文件会发生什么。是否有指定的方法来调用生成文件的命令函数?

我在for循环中的Jupyter-notebook单元格中运行它。该for循环用于迭代地改变输入文件,从而系统地改变模拟的条件。我的操作系统是mac osx。

目标是在for循环的每次迭代中模拟或运行命令,然后将输出文件数据存储在更大的字典中。后来我想在最小化残差的优化过程中迭代地将输出文件数据与实验数据进行比较。

我将不胜感激任何帮助。如果popen不是正确的python函数,那么任何方向。

1 个答案:

答案 0 :(得分:0)

让我们从像这样简单的东西中学习:

# This is equivalent with the command line `dir *.* /s /b` on Windows
import subprocess
sp = subprocess.Popen(['dir', '*.*', '/s', '/b'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
(std_out, std_err) = sp.communicate()   # returns (stdout, stderr)

# print out if error occur
print('std_err: ', std_err)   # expect ('std_err: ', '')
# print out saved echoing messages
print('std_out: ', std_out)   # expect ('std_out: ', ... can be a long list ...)