亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go os/exec 命令中激活 Python venv

在 Go os/exec 命令中激活 Python venv

Go
藍山帝景 2022-10-17 19:23:23
我正在嘗試從 Go os/exec Command&Run方法“激活”(或更確切地說是偽激活)python 虛擬環境,以用于其他命令執行。我知道每個命令執行實際上都是一次隔離運行,因此不會保留環境變量等,因此我一直在嘗試手動重新創建激活期間發生的環境更改。根據文檔,這應該是可能的:您不需要特別激活環境;激活只是將虛擬環境的二進制目錄添加到您的路徑中,以便“python”調用虛擬環境的 Python 解釋器,您可以運行已安裝的腳本而無需使用它們的完整路徑。但是,安裝在虛擬環境中的所有腳本都應該可以在不激活它的情況下運行,并自動使用虛擬環境的 Python 運行。但是,當我在 Go 中嘗試此操作時,我無法獲得在虛擬環境中運行的命令 - 例如pip install requests始終安裝到全局 pip 緩存。下面是我正在使用的代碼:  func Run(cmd *exec.Cmd) (exitCode int, err error) {    cmdErr := cmd.Run()    if cmdErr != nil {          exitCode, err = getExitCode(cmdErr)     }    return exitCode, err  }  func getExitCode(exitError error) (rc int, err error) {    if exitErrorOnly, ok := exitError.(*exec.ExitError); ok {        waitStatus := exitErrorOnly.Sys().(syscall.WaitStatus)        rc = waitStatus.ExitStatus()    } else {        err = fmt.Errorf("could not get exit code, using default")    }    return rc, err  }  func main() {    // using pre-existing venv for testing    const venv = "C:\\Users\\acalder\\Projects\\go\\runinvenv\\venv"    cmd := exec.Command("pip", "install", "requests")    cmd.Stdout = os.Stdout    cmd.Stderr = os.Stderr    cmd.Env = append(os.Environ(),        // these were the only ones i could see changing on 'activation'        "VIRTUAL_ENV=" + venv,        "PATH=" + venv + "\\Scripts;" + os.Getenv("PATH"),    )    exitCode, err := Run(cmd)    fmt.Println("exitCode:", exitCode)    fmt.Println("err:", err)  }
查看完整描述

1 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

當你運行時:

cmd := exec.Command("pip", "install", "requests")

Go 調用 exec.LookPath以查找pip可執行文件的文件路徑。由于您在調用PATH后添加了對環境變量的調整,因此將指向您的系統 python。您可以通過在調用后打印來確認這一點。exec.Commandcmd.Pathcmd.Pathexec.Command

我建議將“pip”替換為 venv 中“pip”可執行文件的位置。(對不起,我不懂windows)像:

cmd := exec.Command("C:\\Users\\acalder\\Projects\\go\\runinvenv\\venv\\bin\\pip", "install", "requests")

或者:

    cmd := exec.Command("pip", "install", "requests")
    cmd.Path = "C:\\Users\\acalder\\Projects\\go\\runinvenv\\venv\\bin\\pip"

由于 exec.LookPath 依賴于os.Getenv,或者我認為這也可以:

os.Setenv("PATH",  venv + "\\Scripts;" + os.Getenv("PATH"))
cmd := exec.Command("pip", "install", "requests")

一旦你開始工作并且“pip”指向正確的位置,我猜你仍然需要更新cmd.Env(就像你已經擁有的那樣),以便對“pip”或“python”的任何底層調用也使用正確的可執行文件在你的venv。


查看完整回答
反對 回復 2022-10-17
  • 1 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號