如何通过Python的OS模块实现命令提示符多命令持续会话?
Python os模块执行多行命令的会话不持久问题
你遇到的问题本质是:os.system()和os.popen()每次调用都会启动独立的子进程,每个子进程有自己的环境变量和工作目录,互相不共享。所以你先调用cd切换目录,只在那个临时子进程里生效,后续的pip freeze是在新的子进程里执行,自然还是原来的目录。
下面是几种可行的解决办法:
1. 单进程内串联多个命令
用&&把多个命令连在一起,让它们在同一个子进程里执行:
from os import popen, getlogin # 把cd和pip freeze放在同一个命令里执行 output = popen(f'cd C:/Users/{getlogin()} && pip freeze').read() print(output)
2. 直接指定子进程的工作目录(更推荐)
不用cd命令,直接给子进程指定工作目录,popen支持cwd参数:
from os import popen, getlogin user_dir = f'C:/Users/{getlogin()}' # 直接指定执行pip freeze的目录 output = popen('pip freeze', cwd=user_dir).read() print(output)
如果追求更安全、功能更丰富的方式,建议用subprocess模块(官方更推荐替代os模块的旧方法):
import subprocess from os import getlogin user_dir = f'C:/Users/{getlogin()}' # subprocess可以直接指定工作目录,还能更灵活处理输出 output = subprocess.check_output(['pip', 'freeze'], cwd=user_dir, text=True) print(output)
3. 用批处理文件执行复杂多命令
如果有一堆复杂的多行命令,可以把它们写到.bat文件里,再用Python调用:
rem 保存为commands.bat cd C:/Users/%USERNAME% pip freeze
然后Python中调用:
from os import system system('commands.bat')
内容的提问来源于stack exchange,提问作者Anonimous235
相关产品推荐
相关产品推荐

