如何通过python执行shell脚本

如何通过python执行shell脚本,python,shell,subprocess,popen,Python,Shell,Subprocess,Popen,我有一个脚本,比如abc.sh,它有带标志的命令列表。 范例 我想通过python代码执行这个脚本。 说 这个电话不通 其他的选择是什么 此外,shell脚本文件位于其他目录中。我希望输出进入日志。通常您希望使用,因为之后您有流程控制。尝试: process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE, stderr=PIPE) process.wait() # Wait for process to

我有一个脚本,比如abc.sh,它有带标志的命令列表。 范例

我想通过python代码执行这个脚本。 说

这个电话不通

其他的选择是什么

此外,shell脚本文件位于其他目录中。我希望输出进入日志。

通常您希望使用,因为之后您有流程控制。尝试:

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE, stderr=PIPE)
process.wait() # Wait for process to complete.

# iterate on the stdout line by line
for line in process.stdout.readlines():
    print(line)
通常情况下,您希望使用,因为您有过程控制之后。尝试:

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE, stderr=PIPE)
process.wait() # Wait for process to complete.

# iterate on the stdout line by line
for line in process.stdout.readlines():
    print(line)
试试这个:

//xyz.py

name = 'FUnCOder'
filename1  = 'aaa.txt'
filename2 = 'bbb.txt'

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE)
process.wait()
请注意,'abc.sh'在引号中,因为它不是一个变量名,而是您正在调用的命令

一般来说,我还建议使用
shell=False
,尽管在某些情况下有必要使用
shell=True

要将输出放入文件,请尝试:

with open("logfile.log") as file:
    file.writelines(process.stdout)
试试这个:

//xyz.py

name = 'FUnCOder'
filename1  = 'aaa.txt'
filename2 = 'bbb.txt'

process = subprocess.Popen(['abc.sh', name, filename1, filname2], stdout=PIPE)
process.wait()
请注意,'abc.sh'在引号中,因为它不是一个变量名,而是您正在调用的命令

一般来说,我还建议使用
shell=False
,尽管在某些情况下有必要使用
shell=True

要将输出放入文件,请尝试:

with open("logfile.log") as file:
    file.writelines(process.stdout)

我知道这是一个老问题,下面是使用Python 3.5及以上版本的方法

import subprocess
process = subprocess.run('script.sh', shell=True, check=True, timeout=10) 

Ref:我知道这是一个老问题,下面是使用Python 3.5及以上版本的方法

import subprocess
process = subprocess.run('script.sh', shell=True, check=True, timeout=10) 


Ref:

我尝试了这个,但在屏幕上无法获得任何输出。。。你能解释一下重定向到管道而不是标准输出吗?通过重定向到管道,你可以使用
process.STDOUT.readlines()
process.STDOUT.read()读取脚本的标准输出
等等。我认为这也是唯一的选择,因为他想记录输出。它工作了,但脚本没有接受我传递的任何参数。有什么问题吗?如果你使用的脚本与原来问题中的脚本相同,那么你就做错了。Shell脚本参数以
$1$2$3
等形式传递。我尝试了此操作,但无法在屏幕上获得任何输出。。。你能解释一下重定向到管道而不是标准输出吗?通过重定向到管道,你可以使用
process.STDOUT.readlines()
process.STDOUT.read()读取脚本的标准输出
等等。我认为这也是唯一的选择,因为他想记录输出。它工作了,但脚本没有接受我传递的任何参数。有什么问题吗?如果你使用的脚本与原来问题中的脚本相同,那么你就做错了。Shell脚本参数以
$1$2$3
等形式传递。您是否考虑过使用而不是bash脚本。使用
shell=True
尝试
shutils.copyfile
这里是错误的,并且会导致bug。您是否考虑过使用而不是bash脚本。使用
shell=True
尝试
shutils.copyfile
这里是错误的,并且会引发错误。尝试在没有管道的情况下运行它。我打印了此调用的retcode,并且它显示为0…这意味着它失败了。。。知道为什么吗?返回代码0表示它没有失败,.Lolz…我引用了这个@RishabhAgarwal不要相信你在网上读到的一切。wikipedia引用是正确的。请尝试在不使用管道的情况下运行它。我打印了此调用的retcode,它的名称为0…这意味着它失败了。。。知道为什么吗?返回代码0表示它没有失败,.Lolz…我引用了这个@RishabhAgarwal不要相信你在网上读到的一切。维基百科参考是正确的。