在Python代码中使用`pip Frozen> Requirements'

时间:2019-01-31 14:13:57

标签: python python-3.x pip

我发现了如何在代码中使用pip命令:

library(plotly)
library(shiny)
library(DT)
library(dplyr)

ui <- fluidPage(
  mainPanel(
    plotlyOutput("heat")
  ),
  DT::dataTableOutput('tbl4')
)

server <- function(input, output, session) {
  output$heat <- renderPlotly({
    col1<-sample(500, size = 500, replace = TRUE)
    col2<-sample(500, size = 500, replace = TRUE)
    d<-data.frame(col1,col2)
    d=d %>%
      group_by(col2) %>%
      mutate(count = n()) # You can programatically add count for each row
    render_value(d) # You need function otherwise data.frame NN is not visible
    p <- plot_ly(x = d$count, type = "histogram",source="subset") 
    # You should histogram of count
    # set source so that you can get values from source using click_event       
  })

  render_value=function(d){
    output$tbl4 <- renderDataTable({
      s <- event_data("plotly_click",source = "subset")
      print(s)
      return(DT::datatable(d[d$count==s$x,]))           
    })  
  }           
}

shinyApp(ui, server)

它将在命令提示符下显示所有软件包。

但是这种方式不起作用:

import subprocess
subprocess.call(["pip", "freeze"])

它不会将其写入文件,而是再次在控制台中打印。

如何以正确的方式运行此命令?

2 个答案:

答案 0 :(得分:7)

使用此:

>>> with open('requirements.txt', 'w') as file_:
...   subprocess.Popen(['pip', 'freeze'], stdout=file_).communicate()
...

或者call(如果您愿意)

>>> with open('requirements.txt', 'w') as file_:
    ...   subprocess.call(['pip', 'freeze'], stdout=file_)

答案 1 :(得分:3)

重定向是在Shell /终端中实现的,这意味着必须在命令行中使用shell=True关键字参数来执行命令。否则,子进程将执行列表中的第一项,并将其余部分用作其参数。有关更多信息,请参见documentation

subprocess.call("pip freeze > requirements.txt", shell=True)