(py2.7)通过子进程长“回声”

Posted

技术标签:

【中文标题】(py2.7)通过子进程长“回声”【英文标题】:(py2.7) long "echo" via subprocess 【发布时间】:2016-06-18 23:46:48 【问题描述】:

我开始编写一些 python 代码来使用代理服务器启动新服务器/VM

由于语法错误而无法正常工作

subprocess.call("echo  'http_proxy="http://proxy.srx.com:80/" \nhttps_proxy="http://proxy.srx.com:80/" \nno_proxy="127.0.0.1, localhost, *.internaldns.com, 172.27.255.88, 172.27.255.89" ' >> /etc/environment ", shell=True);

所以我尝试将 \n 分成

#!/usr/bin/python

import os;
import subprocess;

subprocess.call(["ls", "/etc/"]);

print "=====Next Command=====";

print "echo to environment";

subprocess.call("echo "http_proxy="http://proxy.srx.com:80/"" >> /etc/environment", shell=True);
subprocess.call("echo "https_proxy="http://proxy.srx.com:80/"" >> /etc/environment", shell=True);
subprocess.call("echo "no_proxy="127.0.0.1, localhost, *.internaldns.com, 172.27.255.88, 172.27.255.89"" >> /etc/environment", shell=True);


print "=====Next Command=====";
subprocess.call("ls /root/", shell=True);

#if CentOS yum.conf

#if Ubuntu apt.conf
~                     

但是还是这个语法错误?

~# ./sys.py 
  File "./sys.py", line 12
    subprocess.call("echo "http_proxy="http://proxy.srx.com:80/"" >> /etc/environment", shell=True);
                                    ^
SyntaxError: invalid syntax

谢谢! 我尝试了很多 ' 和 " 的组合,但没有运气。

【问题讨论】:

您正在尝试使用相同的引号来分隔字符串内部的外部字符串而不转义它。当然,如果您不使用基于str 的命令和shell=True,这会容易得多;基于list 的命令减少了对内部引号的需求。或者在这种特殊情况下,跳过毫无意义的 subprocess 使用,而只支持 opening 文件和 print/writeing 直接使用它。 with open('/etc/environment', 'a') as env:,然后在区块env.write('http_proxy="http://proxy.srx.com:80/"\n') 不相关:不要将您的 Python 脚本命名为标准 Python 模块,例如 sys。否则,可能会出现意外错误,example1、example2、example3、example4 等。 @J.F.塞巴斯蒂安哦,哇,我不知道。谢谢。 【参考方案1】:

问题是"echo "http_proxy="http://proxy.srx.com:80/""... 不是一个有效的字符串

你应该使用:

subprocess.call("""echo "http_proxy="http://proxy.srx.com:80/"" >> /etc/environment""", shell=True);

【讨论】:

subprocess.call("""echo "http_proxy="proxy.srx.com:80" \nhttps_proxy="proxy.srx.com:80"" >> /etc/environment""", shell=True); (现在我换成了那个谢谢!!) @SndLt:这里有什么理由不使用纯 Python:with open('/etc/environment', 'a') as f: print >>f, 'http_proxy=http://proxy.srx.com:80/' 将在 python 中执行整个 bash 脱壳任务。 (只是想习惯它)这是您推荐的常规 CentOS/Ubuntu 家务活吗?再次感谢 @SndLt :使用您最了解的任何脚本语言。如果您使用 Python,那么如果有简单的纯 Python 解决方案可用,例如 echo -> file.writels -> os.listdir(),则不要运行 shell。如果你有一个现有的 bash 脚本,那么整个运行它——如果它已经工作了,就不需要重写它。

以上是关于(py2.7)通过子进程长“回声”的主要内容,如果未能解决你的问题,请参考以下文章

golang父进程通过管道向子进程传递数据

创建进程的多个子进程并维护其所有 PID 的共享数组

Linux下异步回收子进程

fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)

通过其子进程分析一个进程并在之后杀死该子进程

通过管道从多个子进程写入父进程