如何在python中设置代理值和运行linux命令

2024-10-01 17:36:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在linux中,要设置代理值,请执行以下操作。在

proxy=http://$user:$password@proxy.server.com:${NUM}
http_proxy="$proxy" https_proxy="$proxy" ${COMMAND}

出于安全原因,如果您在子shell中运行此程序,则不会显式地将您的密码放在打开的或日志中。这种方法的问题是,每次我想运行命令时都必须设置用户名和密码。在

因此决定为它编写一个python代码。我有一个C语言的工作版本,只想用Python学习更多。我已经找到了很好的方法来编码和解码我的密码,在大部分的胡说八道之后,我把它传递给这个函数来测试代理连接。在

^{pr2}$

我遇到的问题是使用supprocess,我知道subprocess不允许您使用export,因为它不是真正的命令。Subprocess module errors with 'export' in python on linux?

这是我的实现

finalCommand = ["/bin/sh", "-c"]
finalCommand.append(http_proxy)
finalCommand.append(https_proxy)
for x in bashCommand:
    finalCommand.append(x)

print subprocess.call(finalCommand)
process = subprocess.Popen(finalCommand,stdout=subprocess.PIPE)


out, err = process.communicate()

print "Output ... \n %s" % (out)

if err == None: 
    print "No errors"
else: 
    print "Errors ... \n %s" %(err)

不幸的是,经过几次测试,我的程序总是没有输出,也没有错误。 我已经打印了curl的输出,所以我知道解码、编码或代理不是问题所在。有什么建议吗?在

回答后编辑: Interaction between Python script and linux shell

env确实解决了我的问题,但我也不得不参考上面的线程。我运行的一些命令是交互式的,正如它在线程中很好地解释的那样,PIPE不能在交互式程序中正常工作。在


Tags: 方法https命令程序http密码代理linux
1条回答
网友
1楼 · 发布于 2024-10-01 17:36:10

如果不知道您要运行的命令是什么,很难确定,但是我很确定您要做的是为您的子进程设置环境,使用env参数来^{}

env = dict(os.environ)
env['http_proxy'] = proxy
env['https_proxy'] = proxy
for command in commands:
    out = subprocess.check_output(command, env=env)

如果要修改自己的环境,而不仅仅是子进程的环境,只需在适当的地方修改^{}。(有关特定于平台的问题以及如何处理这些问题,请参阅文档。)


同时,没有错误的原因很简单:

^{pr2}$

如果不将stderr=subprocess.PIPE传递给Popen构造函数,则它不会捕获stderr,因此err将以None结束。在

顺便说一句,您几乎不想检查== None。通常,只要if not err:就足够了。如果不是,则几乎总是需要if err is not None:。其中==是必要的但不是不足的情况集合是小得可以忽略的。更多细节请参见PEP8中的Programming Recommendations。在

还有一个附加说明:你可以写finalCommand.extend(x)^{}方法的作用与在iterable上循环和对每个元素逐个执行append相同,只是它更易读、更难出错、更简洁、更快。在

相关问题 更多 >

    热门问题