python子流程中的基本cygwin命令
我想从python运行cygwin并执行cygwin命令 我使用的是Windows,所以我想在cygwin而不是cmd中运行命令。我正在使用Python 3.6.1 我只想知道如何运行基本命令,这样我就可以从那里像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()会导致/
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)
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/简介因为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])
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])