来自python子进程的基本cygwin命令

时间:2017-06-10 18:49:47

标签: python windows bash shell

我想从python运行cygwin并执行cygwin命令。

我正在使用Windows,所以我想在cygwin而不是cmd中运行命令。我使用的是Python 3.6.1。

我只想知道如何运行基本命令,以便我可以像ls那样在那里工作。我试过了:

  • subprocess.call("E:/cygwin/bin/bash.exe", "ls")(类似这样,但不起作用)
  • @pstatix建议的下面的解决方案,它使用Popen()。在stdin.write(b'ls')之后运行stdin.close()会导致/usr/bin/bash: line 1: ls: command not found错误

我能够做到以下几点:

  • 打开cygwin:subprocess.call("E:/cygwin/bin/bash.exe")

  • (在Windows cmd上运行命令:subprocess.call("dir", shell=True)

这种格式是否可行? 当我运行下一个python命令时,cygwin会自动关闭,还是我需要在此之前退出?

我对此比较陌生。

2 个答案:

答案 0 :(得分:2)

maxlag : integer

    the Granger causality test results are calculated for all lags up to maxlag

答案 1 :(得分:0)

from subprocess import Popen, PIPE, STDOUT

p = Popen(['E:/cygwin/bin/bash.exe', '-c', '. /etc/profile; ls'], 
          stdout=PIPE, stderr=STDOUT)
print(p.communicate()[0]))

这将打开bash,执行-c之后提供的命令并退出。

您需要前置. /etc/profile;,因为bash是在非交互模式下启动的,因此不会初始化任何环境变量,您需要自己获取它们。

如果您通过用户文件夹(如我所拥有)中的 babun 软件安装了cygwin,则代码如下所示:

from subprocess import Popen, PIPE, STDOUT
from os.path import expandvars

p = Popen([expandvars('%userprofile%/.babun/cygwin/bin/bash.exe'), '-c', '. /etc/profile; ls'], 
          stdout=PIPE, stderr=STDOUT)
print(p.communicate()[0])