python
  • shell
  • subprocess
  • os.system
  • 2017-05-05 83 views 1 likes 
    1

    我想用shell命令从它中提取一个变量,我想在我的python程序的其余部分使用它。例如,此代码尝试使用subprocess.callos.system。前者给了我一个错误,而后者不产生任何东西,但如果我在shell命令中不使用变量,两者都可以正常工作。Python不执行使用变量的shell命令

    import subprocess 
    import os 
    # ... 
    
    x="05/May/2017" 
    
    print 'Date =',x 
    
    subprocess.call(['echo Hello World from method 1'], shell=True) 
    os.system('echo Hello World from method 2') 
    
    print "Month from method 1 =" 
    subprocess.call(['echo $x | cut -f2 -d/']) 
    
    
    print "Month from method 2 =" 
    m=os.system('echo $x | cut -f2 -d/') 
    print m 
    

    问题在哪里,我该如何克服这个问题?

    +0

    'x'是你的python脚本的一个变量。它不是一个环境变量。因此,在shell中执行时,它会失败 – kuro

    +0

    如何 - 'os.system('echo%s | cut -f2 -d /'%x)'? – kuro

    +1

    这里没有任何理由需要外部过程。 'month = x.split('/')[1]'。有没有更好的例子可以证明“subprocess.call”的正确使用? – chepner

    回答

    0

    问题是,python变量没有传递给子进程(shell命令)。

    简单的解决方案:

    m=subprocess.getoutput('echo %s | cut -f2 -d/' % (x,))

    'echo %s | cut -f2 -d/' % (x,)将首先蟒蛇替换“%s”与变量x的内容,然后调用 subprocess.getoutput('echo 05/May/2017 | cut -f2 -d/')

    +0

    该方法是正确的,但这仍然是一个不正确的使用'调用'。 – chepner

    +0

    这给我一个错误。 :( – hbaromega

    +0

    好的,如果我们在其中添加'shell = True',它就可以工作。但是,我无法为其指定变量'm',如原始问题所示。 – hbaromega

    0

    如果你想传递一个环境变量到一个子过程,你必须明确地将它添加到os.environ,如下所示。另一种选择是创建一个新环境并将其传递给.call

    import subprocess; 
    import os; 
    os.environ['foo'] = "bar"; 
    subprocess.call('echo $foo', shell=True); 
    

    在上述情况下,还需要shell=True,否则subprocess.call将寻找字面上叫echo $foo的可执行文件。

    当然,我们可以手动设置命令行参数:

    foo = "bar"; 
    subprocess.call(['echo', foo]); 
    

    ,但那就不是一个环境变量。

    至于你正在做的实际调用,我希望你只是为了实验而运行cut作为子进程,像这样的字符串处理最好在Python脚本中完成。

    +0

    糟糕,我错过了'shell =真的'在我的第二个'subprocess.call'行。一旦我把它删除了错误。 – hbaromega

    相关问题