提前感谢您的帮助。我是python的新手,但对脚本来说并不是特别新手。我正在尝试运行一个简单的自动化电子邮件程序,但电子邮件模块似乎在我们的系统上安装不正确(我没有在python示例中描述的75%的函数,只有“message_from_string”和“message_from_file”)并且smtplib对于我需要的东西过于复杂。
事实上,在简单的bash术语中,我只需要:
/bin/email -s "blah" "recipients" < file.with.body.info.txt
,或者
echo "my body details" | /bin/email -s "blah" "recipients"
这样我就可以避免只是为了发送消息而写入文件。
我尝试使用子进程,无论是调用还是Popen,我最终能够使用的唯一方法就是使用:
subprocess.call('/bin/mail -s "blah" "recipients" < file.with.body.info.txt', shell=True)
我特别不喜欢这个方法的一些事情:
(1)我无法将事物分解为列表或元组,因为它应该起作用,因此我失去了子进程的全部优势,正如我所理解的那样,保证了事物的安全。如果我试过:
subprocess.call(['/bin/mail', '-s', subjVariable, recipVariable, '<', 'file.with.body.info.txt'], shell=True)
它会失败。同样,如果我尝试使用管道“|”而不是从文件中读取,它将失败。如果我使用'-cmd'而不是管道,它也失败了。 “失败”通常是它会读到'&lt;'和'file.with.body.info.txt'一样,好像他们是进一步的收件人。换句话说,无论我是否说“shell = True”,子进程都无法将调用中的特殊字符解释为它们的特殊字符。 '&LT;'没有被识别为来自文件等的输入,除非我将所有内容保存在一个大的呼叫中。
我希望能够做到这一点,因为它似乎更安全,更灵活,是这样的:
subprocess.call(['/bin/echo', varWithBody, '|', '/bin/mail', '-s', subjVariable, recipVariable,])
但似乎管道根本没有用子进程来理解,我无法弄清楚如何在python后面将事物一起管道。
有什么建议吗?除了试图解释如何使用'email'或'smtplib'模块之外,欢迎所有帮助。无论这个特定的应用程序,我真的想学习如何更好地使用子进程,以便我可以将不同的程序联系在一起。我的理解是python应该相当不错。
谢谢!麦克
答案 0 :(得分:5)
|
和<
不是参数;它们是shell重定向。要替换代码中的|
,请参阅these instructions。
要替换<
,请使用:
subprocess.Popen(["command", "args"], stdin=open("file.txt", 'r'))
例如
subprocess.Popen(["cat"], stdin=open("file.txt", 'r'))
与cat < file.txt
答案 1 :(得分:5)
Python docs似乎涵盖了这种情况。
我可能会做的事情如下:
from subprocess import *
readBody = Popen(["/bin/echo", varWithBody], stdout=PIPE)
mail = Popen(["/bin/mail", "-s", subjVariable, recipVariable], stdin=readBody.stdout, stdout=PIPE)
output = mail.communicate()[0]
答案 2 :(得分:4)
<
,|
等是shell的功能,而不是操作系统。因此像subprocess这样的东西对它们一无所知 - 在内部它只是将参数列表传递给等效的OS函数。使用子进程执行输入/输出重定向的方法是使用stdin
,stdout
和strerr
参数。您可以传入一个文件对象(它必须包含文件描述符,但通常打开的文件总是这样做)或裸文件描述符。或管道对象。
本手册有replacing a pipeline的示例,只需用文件对象替换管道,您应该全部设置。
答案 3 :(得分:2)
您需要使用shell
参数在shell中运行命令:
>>> import subprocess
>>> subprocess.call('ls -a | cat', shell=True)
.
..
.git
.gitignore
doc
generate_rands.py
infile1
infile2
infile3
matrix.pyc
matrix.py~
median.py
problems
simple_median.py
test
test_matrix.py
test_matrix.py~
test_median.py