python调用命令行脚本

本文详细介绍了Python中阻塞态和非阻塞态调用的区别,主要涉及os模块的popen和system方法以及subprocess模块的call和popen函数。阻塞态调用会在脚本执行完后继续执行,而非阻塞态调用则通过子进程实现并发。os.system返回程序状态,os.popen返回脚本输出;subprocess.call简单调用,popen允许设置工作目录和环境变量。了解这些概念对于优化Python程序的执行效率至关重要。

阻塞态调用和非阻塞态调用,这两个名字是自己根据调用的特点给区分的。
两者主要的区别在于是否会另外开辟一个子进程去调用这些命令行的脚本。在所谓的阻塞态调用下,python会等待这个脚本执行完毕再顺序往下执行其它的程序。
在所谓的非阻塞态调用下,python则会开辟一个子进程,将脚本放在子进程里面执行,自己则立刻向下运行。

阻塞态调用

使用os模块,主要涉及到popen和system两种方法。
这两种方法的区别参考一下链接
os.system(cmd) 返回的是程序运行的结果状态,比如程序运行成功,则返回0,有错误则返回其对应的错误代码
os.popen(cmd) 返回的是程序输出的结果,比如cmd=“ls”的时候,通过popen就可以得到ls的结果

cmd = "echo hello wolrd"
ret = os.popen(cmd)
information = os.system(cmd)

非阻塞态调用

非阻塞态调用主要用到了subprocess 这个模块
简单的用法就用subprocess.call(cmd)就可以了
更高级复杂的用法可以使用subprocess.popen(cmd)
比如说有时候因为环境变量的配置我们需要在特点的目录下执行脚本,就可以使用subprocess.popen的cwd参数,要配置环境变量而不是继承原有的环境变量可以使用env参数

workingDirector = r"E:/code"
cmd = r"test.bat"
subprocess.popen(cmd,cwd=workingDirector)

 

### 在 Python调用命令行执行外部脚本的方法 在 Python 中,可以通过 `subprocess` 模块来调用命令行执行外部脚本。以下是具体实现方法和示例代码: #### 使用 `subprocess.run` `subprocess.run` 是一种简单且直观的方式,用于运行外部命令捕获其输出[^4]。 ```python import subprocess # 执行外部脚本捕获输出 result = subprocess.run(['python', 'script.py', 'arg1', 'arg2'], capture_output=True, text=True) # 输出标准输出和错误信息 print("Standard Output:", result.stdout) print("Standard Error:", result.stderr) ``` #### 使用 `subprocess.Popen` 对于更复杂的场景,例如需要实时处理输出或与进程交互时,可以使用 `subprocess.Popen`[^3]。 ```python from subprocess import Popen, PIPE # 启动外部脚本 process = Popen(['python', 'script.py', 'arg1', 'arg2'], stdin=None, stdout=PIPE, stderr=None, shell=False) # 获取输出结果 output, errors = process.communicate() # 打印输出结果 print(output.decode('utf-8')) ``` #### 注意事项 - 如果需要传递参数给外部脚本,可以直接将参数作为列表中的元素传入,如 `['python', 'script.py', 'arg1', 'arg2']`。 - 使用 `shell=True` 时需要注意安全性问题,尤其是在处理用户输入的情况下[^3]。 - 对于需要实时处理输出的场景,可以结合 `process.stdout.readline()` 实现逐行读取[^3]。 #### 示例:执行带有参数的外部 Python 脚本 以下是一个完整的示例,展示如何通过命令行调用一个带参数的 Python 脚本捕获其输出[^1]。 ```python import sys def main(): if len(sys.argv) > 1: print(f"参数: {sys.argv[1:]}") else: print("无参数输入") if __name__ == "__main__": main() ``` 保存上述代码为 `script.py`,然后通过以下方式调用它: ```python import subprocess result = subprocess.run(['python', 'script.py', 'param1', 'param2'], capture_output=True, text=True) print(result.stdout) ``` #### 常见错误及解决方法 - **错误:找不到命令** 确保目标脚本路径正确,或者将其添加到系统环境变量中[^2]。 - **错误:权限不足** 在某些情况下,可能需要以管理员权限运行脚本[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值