簡體   English   中英

如何在子流程模塊打開的bash中添加環境變量?

[英]How to add environment variables to the bash opened by subprocess module?

我需要在帶有subprocess.call函數的Python腳本中使用wget,但是看來“ wget”命令無法由python打開的bash子進程識別。

我添加了環境變量(wget所在的路徑):

export PATH=/usr/local/bin:$PATH

到我的Mac上的〜/ .bashrc文件和〜/ .bash_profile文件,並保證已將它們作為來源。 python腳本看起來像:

import subprocess as sp
cmd = 'wget'
process = sp.Popen(cmd ,stdout=sp.PIPE, stdin=sp.PIPE, 
stderr=sp.PIPE, shell=True ,executable='/bin/bash')
(stdoutdata, stderrdata) = process.communicate()
print stdoutdata, stderrdata

預期的輸出應該像

wget: missing URL
Usage: wget [OPTION]... [URL]...

但是結果總是

/bin/bash: wget: command not found

有趣的是,如果我直接在bash終端中輸入wget,我可以獲得幫助輸出,但是它在python腳本中永遠無法工作。 怎么會這樣?

PS:

如果我將命令更改為

cmd = '/usr/local/bin/wget'

然后就可以了。 所以我確定我安裝了wget。

您可以將env=參數傳遞給subprocess函數。

import os

myenv = os.environ.copy
myenv['PATH'] = '/usr/local/bin:' + myenv['PATH']
subprocess.run(..., env=myenv)

但是,您可能根本想避免運行Shell,而是增加Python用於查找要在子進程調用中運行的二進制文件的PATH

import subprocess as sp
import os

os.environ['PATH'] = '/usr/local/bin:' + os.environ['PATH']
cmd = 'wget'
# use run instead of Popen
# don't needlessly use a shell
# and thus put [cmd] as a list
process = sp.run([cmd], stdout=sp.PIPE, stdin=sp.PIPE, 
stderr=sp.PIPE, 
    universal_newlines=True)
print(process.stdout, process.stderr)

在Python中運行Bash命令將詳細解釋我所做的更改。

但是,沒有充分的理由為此使用外部實用程序。 Python requests幾乎可以完成wget所做的所有事情,通常更自然,並且可以更好地控制其確切功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM