python子流程中的基本cygwin命令

python子流程中的基本cygwin命令,python,windows,bash,shell,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()会导致/

我想从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上运行命令:
    子进程调用(“dir”,shell=True)

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

我对这个比较陌生

from subprocess import Popen, PIPE

p = Popen("E:/cygwin/bin/bash.exe", stdin=PIPE, stdout=PIPE)
p.stdin.write("ls")
p.stdin.close()
out = p.stdout.read()
print (out)
这将打开bash,执行
-c
之后提供的命令并退出

您需要带前缀的
/etc/简介
如果在用户文件夹中的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])

p.stdin.write(“ls”)
抛出一个错误:“TypeError:类似字节的对象是必需的,而不是'str'”。似乎“ls”不是.write()的正确参数,还是我做错了什么?其他命令似乎也可以使用。@sandboxj您使用的Python版本是什么?要发送这样的字节,只需执行
p.stdin.write(b'ls')
。但是,与Python 2.7.13上的代码一样,代码没有问题。我使用的是Python 3.6.1。建议的带有(b'ls')的解决方案使.write行工作,但当输入
p.std.in.close()
时,它会奇怪地返回
/usr/bin/bash:line 1:ls:command not found
。另外,当输入剩下的两行时,它最终会打印
b'
@sandboxj为什么要编写
p.std.in.close()
?在
stdin
的中间文件中没有
。你应该用你正在测试的完整代码更新你发布的问题;我们可以从那里开始。一旦我使用管理员权限运行Python,这段代码就可以运行了。您还没有显示完整的代码行集。更新你的帖子,显示一系列与我的答案类似的行。我们需要看到这一切,以帮助。你的代码和上面的行是字面上所有我。我正在试图弄清楚这是如何工作的,这样我就可以在它的基础上运行/编写其他命令,目前我真的没有其他东西了。你应该能够直接运行很多命令,而不必运行bash并写入其stdin。Unix命令行主要由一些小程序组成,如
/bin/ls
,对于您来说,这些程序可能是
E:/cygwin/bin/ls.exe
@sandboxj,正如eryksun评论的那样,
bash.exe
打开了一个没有任何选项的空壳(如/bash/bin);是一篇讨论mintty.exe和bash.exe的文章,解释了这一点。除此之外,我要求你添加代码是完整地添加代码,就像我发布的答案一样。你只是简单地将要点与你所尝试的内容联系起来。给我们看完整的代码,缩进和所有!
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])