2017-06-10 3 views
0

Ich möchte Cygwin von Python ausführen und Cygwin-Befehle ausführen.Basic cygwin Befehle von Python Subprozess

Ich benutze Windows, also möchte ich Befehle in Cygwin nicht Cmd ausführen. Ich benutze Python 3.6.1.

Ich möchte nur wissen, wie grundlegende Befehle ausgeführt werden, damit ich von dort wie ls arbeiten kann. Ich habe versucht:

  • subprocess.call("E:/cygwin/bin/bash.exe", "ls") (so etwas, aber es funktioniert nicht)
  • die Lösung unten vorgeschlagen von @pstatix, die Popen() verwendet. Laufen stdin.close() nach stdin.write (b'ls') ergibt sich ein /usr/bin/bash: line 1: ls: command not found Fehler

ich in der Lage bin folgendes zu tun:

  • offen Cygwin: subprocess.call("E:/cygwin/bin/bash.exe")

  • (run commmands auf Windows cmd: subprocess.call("dir", shell=True))

Ist dies möglich, in dieser Form beim? Schließt Cygwin automatisch, wenn ich den nächsten Python-Befehl ausführe, oder muss ich vorher beenden?

Ich bin relativ neu dazu.

+0

Sie haben noch nicht Ihre vollständige Reihe von Codezeilen gezeigt. Aktualisieren Sie Ihren Beitrag, um eine Reihe von Zeilen zu zeigen, die meiner Antwort ähneln. Wir müssen alles sehen, um zu helfen. – pstatix

+0

Ihr Code und die obigen Zeilen sind buchstäblich alles, was ich habe. Ich versuche herauszufinden, wie das funktioniert, damit ich darauf aufbauen und andere Befehle ausführen/schreiben kann. Ich habe wirklich nichts anderes im Moment. – sandboxj

+2

Sie sollten in der Lage sein, eine Menge Befehle direkt auszuführen, ohne bash ausführen zu müssen und in seine stdin schreiben zu müssen. Die Unix-Kommandozeile besteht meist aus kleinen Programmen wie '/ bin/ls', was für Sie wahrscheinlich' E:/cygwin/bin/ls.exe' ist. – eryksun

Antwort

2
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) 
+0

'p.stdin.write (" ls ")' löst einen Fehler aus: "TypeError: Ein Byte-ähnliches Objekt wird benötigt, nicht 'str'". Scheint, als wäre "ls" kein richtiges Argument für .write() oder mache ich etwas falsch? Andere Befehle scheinen zu funktionieren. – sandboxj

+1

@sandboxj Welche Version von Python auf dir? Um ein Byte-ähnliches zu senden, einfach 'p.stdin.write (b'ls ')'. Es gibt jedoch kein Problem mit dem Code, wie es auf Python 2.7.13 – pstatix

+0

Ich benutze Python 3.6.1. Die vorgeschlagene Lösung mit (b'ls ') macht die .write-Zeile funktionsfähig, aber bei Eingabe von 'p.std.in.close()' gibt sie seltsamerweise/usr/bin/bash zurück: Zeile 1: ls: Befehl nicht gefunden '. Wenn Sie die verbleibenden zwei Zeilen eingeben, wird schließlich "b" gedruckt. – sandboxj