2015-10-10 53 views
0

我已經試過如何在Windows中打開一個命令外殼和使用python

import os 
os.system('cmd.exe') 

偉大它開闢了一個cmd殼

但我怎麼寫從我的Python命令發出命令到殼腳本,以便打開的shell執行它?

基本上是這樣的

打開一個命令外殼並以某種方式得到了開殼的實例的保持和對其發出命令。子進程模塊似乎並沒有打開一個cmd shell,我不想通過解釋器來查看shell的內容,但實際上是 ,但這就是子進程的作用?

那麼我們該如何打開一個cmd shell並將命令傳遞給該打開的shell呢?

+4

看看python subprocess lib。去谷歌上查詢。 – pregmatch

+2

你需要保持它打開嗎?這是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)?你真的需要實現什麼? –

+0

@PeterWood是的我需要殼打開它只是使用腳本來激活我的virtualenv – Zion

回答

1
import subprocess 
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) 
process.wait() 
print process.returncode 

該命令變量應該是例如:cmd /k。您還可以添加一個stdin=subprocess.PIPE到POPEN參數列表和寫入命令CMD: subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,stdin=subprocess.PIPE)最終代碼:

import subprocess 
process = subprocess.Popen('cmd /k ', shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None) 
process.stdin.write("dir") #passing command 
stdOutput,stdError = process.communicate() 
print stdOutput 
process.stdin.close() 

或者:

from subprocess import * 
Popen("cmd /k dir") 
+0

第3行有錯誤。 'process.stdin.write(「dir」) TypeError:需要類似字節的對象,而不是'str'' – Zion

1

具有相同問題的人是我

我需要在命令提示符窗口中獲得句柄,並且想要激活我的virtualenv並以編程方式運行我的.py文件。

我用pywin32com和研究計算器和Web小時後

我得到了一個有效的解決方案

我不很瞭解的子模塊,但我不知道如果讓我們送你去開命令提示符不同的命令

但這裏是我工作的解決方案

import time 
import os 
from win32com import client 
from win32gui import GetWindowText, GetForegroundWindow, SetForegroundWindow, EnumWindows 
from win32process import GetWindowThreadProcessId 


class ActivateVenv: 

    def set_cmd_to_foreground(self, hwnd, extra): 
     """sets first command prompt to forgeround""" 

     if "cmd.exe" in GetWindowText(hwnd): 
      SetForegroundWindow(hwnd) 
      return 

    def get_pid(self): 
     """gets process id of command prompt on foreground""" 

     window = GetForegroundWindow() 
     return GetWindowThreadProcessId(window)[1] 

    def activate_venv(self, shell, venv_location): 
     """activates venv of the active command prompt""" 

     shell.AppActivate(self.get_pid()) 
     shell.SendKeys("cd \ {ENTER}") 
     shell.SendKeys(r"cd %s {ENTER}" % venv_location) 
     shell.SendKeys("activate {ENTER}") 

    def run_py_script(self,shell): 
     """runs the py script""" 

     shell.SendKeys("cd ../..{ENTER}") 
     shell.SendKeys("python run.py {ENTER}") 

    def open_cmd(self, shell): 
     """ opens cmd """ 

     shell.run("cmd.exe") 
     time.sleep(1) 


if __name__ == "__main__": 

    shell = client.Dispatch("WScript.Shell") 
    run_venv = ActivateVenv() 
    run_venv.open_cmd(shell) 
    EnumWindows(run_venv.set_cmd_to_foreground, None) 
    run_venv.activate_venv(shell, "flask3.5/venv/scripts") 
    run_venv.run_py_script(shell)