【问题标题】:Using Subprocess to Check sudo-apt install Return Value?使用子进程检查 sudo-apt install 返回值?
【发布时间】:2016-01-25 02:05:04
【问题描述】:

我目前正在使用 Python 2.7 编写一个 shell 脚本。要安装 virtual-env,我使用以下内容:

def setup_virtal_env(package): 
    try: 
        subprocess.call('apt-get update', shell=True)
        command = subprocess.call("apt-get install python-" + package, shell=True)
        proc = subprocess.check_call(str(command), stdin=PIPE, stderr=subprocess.STDOUT)
        stdoutdata, stderrdata = proc.communicate(),
        assert proc.returncode == 0, 'Installed failed...'
        print proc.returncode
    except subprocess.CalledProcessError: 
        print >> sys.stderr, "Execution failed", 'OSError,', 'trying pip...'
        'Installed virtualenv with pip...' if install_pip(package) else 'Pip failed...'

我的问题是如何使用 subprocess.check_call 或 subprocess.check_output 来检查用户是否已经安装了 virtualenv 或是否正确安装。截至目前,当我调用 .check_call() 时,它会返回

File "install_.py", line 121, in setup_virtal_env
proc = subprocess.check_call(str(command), stdin=PIPE, stderr=subprocess.STDOUT)
File "/usr/lib/python2.7/subprocess.py", line 535, in check_call
retcode = call(*popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

有没有办法可以使用 subprocess 来检查 virtualenv 是否已正确安装/安装?非常感谢!

【问题讨论】:

  • 无关:该术语具有误导性 apt-get 安装系统包。他们可以,但通常不会创建 virtualenvs。

标签: python linux shell subprocess sudo


【解决方案1】:

当你想使用带参数的命令时,你需要传递一个args数组,比如

suprocess.check_call(["apt-get","install", ...], ...)

否则,系统将尝试查找字面上名为“apt-get update”的可执行文件,因为空格是合法的文件名字符。当然它会失败,给你那个错误。

如果您想在命令中使用单个字符串,请记住使用 shell=True 参数

suprocess.check_call("apt-get install", shell=True, ...)

【讨论】:

  • 啊,好吧,所以我尝试了以下方法,但我仍然得到同样的错误,不幸的是......proc = subprocess.check_call(["apt-get install python-", str(package)], stdout=open(os.devnull,'wb'), stderr=subprocess.STDOUT)
  • 你没有抓住重点,那个命令应该是subprocess.check_call(["apt-get", "install", "python-", str(package)], stdout=open(os.devnull,'wb'), stderr=subprocess.STDOUT)。您是否曾经使用过 C 或 Java 并且不得不使用 main 中的 char *argvString[] args?这正在填充该数组。
  • Awwh,@user2085282 非常感谢,是的,很抱歉这是漫长的一天。我很欣赏 C 的解释完全有道理。
  • 我似乎犯了一个错误,我在您的代码中查看了错误的行。如果您使用shell=True,那么它将分解字符串本身,就像它使用外壳一样。如果不这样做,则需要按照上面列出的方法进行操作。记住要保持一致。
  • @user2808315:你希望"python-"+package 作为一个单个参数,而不是两个。
猜你喜欢
  • 2011-09-23
  • 2023-03-11
  • 1970-01-01
  • 2018-03-01
  • 2014-02-16
  • 1970-01-01
  • 2016-07-28
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多