Oracle Linux中的python3子进程(wget -o)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Linux中的python3子进程(wget -o)相关的知识,希望对你有一定的参考价值。

我看到python子进程上有几个帖子调用bash shell命令。但除非有人找到我遗漏的链接,否则我无法找到问题的答案。

所以这是我的代码的开始。

import os;
import subprocess;
    subprocess.call("wget ‐O /home/oracle/Downloads/puppet-repo.rpm https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm");

当我做

wget ‐O /home/oracle/Downloads/puppet-repo.rpm https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

直接在终端,它的工作原理。

但我的IDE给了我FileNotFoundError: [Errno 2] No such file or directory: 'wget'

同样,我是新手在python中调用os / subprocess模块​​,我很感激有关如何有效使用这些模块的任何见解。

{更新:有了miindlek的回答,我得到了这些错误。 1 - subprocess.call(["wget", "‐O", "/home/oracle/Downloads/puppet-repo.rpm", "https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm"])}

--2015-06-07 17:14:37--  http://%E2%80%90o/
Resolving ‐o... failed: Temporary failure in name resolution.
wget: unable to resolve host address “‐o”
/home/oracle/Downloads/puppet-repo.rpm: Scheme missing.
--2015-06-07 17:14:52--  https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

{与第二个bash方法subprocess.call("wget ‐O /home/oracle/Downloads/puppet-repo.rpm https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm", shell=True)}

Resolving yum.puppetlabs.com... 198.58.114.168, 2600:3c00::f03c:91ff:fe69:6bf0
Connecting to yum.puppetlabs.com|198.58.114.168|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10184 (9.9K) [application/x-redhat-package-manager]
Saving to: “puppetlabs-release-el-6.noarch.rpm.1”

     0K .........                                             100% 1.86M=0.005s

2015-06-07 17:14:53 (1.86 MB/s) - “puppetlabs-release-el-6.noarch.rpm.1” saved [10184/10184]

FINISHED --2015-06-07 17:14:53--
Downloaded: 1 files, 9.9K in 0.005s (1.86 MB/s)

Process finished with exit code 0
答案

您应该将命令字符串拆分为参数列表:

import subprocess
subprocess.call(["wget", "-O", "/home/oracle/Downloads/puppet-repo.rpm", "https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm"])

您还可以使用shell选项作为替代:

import subprocess
subprocess.call("wget -O /home/oracle/Downloads/puppet-repo.rpm https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm", shell=True)

顺便说一下,在python中你不需要在一行的末尾添加分号。

更新选项-O中的破折号是一个utf8连字符Charakter,而不是破折号。参见例如:

>>> a = "‐"  # utf8 hyphen
>>> b = "-"  # dash
>>> str(a)
'xe2x80x9'
>>> str(b)
'-'

您应删除旧破折号并将其替换为普通破折号。我更新了以前的源代码。你也可以从那里复制它。

另一答案

这听起来主要是因为你的IDE正在启动那个python子进程而不是“直接在终端中”。

这将是一个阅读建议,而不是直接回答这个问题。

检查你的IDE;阅读有关如何发布内容的文档。

1 - 在终端类型$ env,你测试$ wget

2 - 在IDE import os ; print(os.environ)

3 - 在这里阅读关于壳和Popen https://docs.python.org/3/library/subprocess.html

从那里开始学习过程。

我甚至建议更换

subprocess.call("wget -O /home/oracle/Downloads/puppet-repo.rpm https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm", shell=True)

明确声明您想要使用什么'shell'

subprocess.Popen(['/bin/sh', '-c', 'wget' '<stuff>'])

缓解未来的IDE / shell / env假设问题。

以上是关于Oracle Linux中的python3子进程(wget -o)的主要内容,如果未能解决你的问题,请参考以下文章

python3中的多处理在mac和linux上运行时得到不同的值

线程与子线程(python3入门)

Python3.5子进程错误

linux 中的多进程中,父进程与子进程共享的代码段和数据段、堆栈段,是整个程序还是出现在fork()函数后?

Python2/3 中执行外部命令(Linux)和程序(exe) -- 子进程模块 subprocess

Windows中的Python子进程