Doskey is a command-line interface for a subset of the Win32 console API. Macros are implemented as console input aliases by calling AddConsoleAlias.
http://msdn.microsoft.com/en-us/library/ms681935
You can load macros from a text file that defines aliases for multiple EXEs:
doskey /macrofile=doskey.cfg
Create this file from your current macros:
doskey /macros:all > doskey.cfg
You can also use ctypes to add an alias.
#!python3
import ctypes
import subprocess
AddConsoleAliasW = ctypes.windll.kernel32.AddConsoleAliasW
AddConsoleAliasW.argtypes = [ctypes.c_wchar_p] * 3
# $db => import builtins;dir(builtins)
AddConsoleAliasW("$db",
"import builtins;dir(builtins)",
"python.exe")
#subprocess.call("doskey")
subprocess.call("stdintest.exe", shell=True)
The "bug" occurs if I uncomment the line to run doskey.
When stdin is a file, calling sys.stdin.tell() before and after running doskey shows that it's reading standard input, for whatever reason. That's its prerogative, not a bug. Calling sys.stdin.seek(0) after running doskey works, but that's not a possibility when doskey is run via the cmd shell's AutoRun.
By the way, redirection to a file is not a pipe. It actually works for a pipe such as
type mytxtfile.txt | testsubproc.py
The good news is that you only need to load doskey macros once for a given console window. You can use an AutoRun script that tests and sets an environment variable:
@echo off
if "%AUTORUN_DOSKEY%"=="No" goto end
echo %0: setting doskey macros
"%SystemRoot%\System32\doskey.exe" /macrofile="%AppData%\doskey.cfg"
set AUTORUN_DOSKEY=No
:end
This should take care of cases where you're redirecting standard input to a file, assuming the shell wasn't started with the /d option to skip AutoRun.
On Posix systems /bin/sh -c doesn't execute .profile, .bashrc, etc. So maybe on Windows Popen should use %ComSpec% /d /c. You'd still have this problem with os.system, however.
|