Python:如何在temp目录创建虚拟环境并使用pip安装模块

问题描述

我想创建一个临时文件并编写一个python脚本。我想在此临时目录下创建一个虚拟环境并使用pip,然后在虚拟环境中运行此脚本。

import pathlib
import tempfile 
import venv

temp = tempfile.TemporaryDirectory()

virtualenv = venv.EnvBuilder(system_site_packages=false)
virtualenv.create(temp.name)

# how could I activate the virtual environment and install the pip module?

with open(pathlib.Path(temp.name)/"run.py","w") as f:
    f.write("#/usr/bin/env python\n\n")
    f.write("import requests\n")

p = subprocess.run(["python",temp.name","run.py"])

解决方法

我相信以下应能达到您的期望:

#!/usr/bin/env python3

import pathlib
import string
import subprocess
import tempfile
import venv

SCRIPT_TEMPLATE = '''\
#!${venv_executable}

import requests
print(requests)
'''

class EnvBuilder(venv.EnvBuilder):

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.context = None

    def post_setup(self,context):
        self.context = context

def main():
    with tempfile.TemporaryDirectory() as target_dir_path:
        print(f" *** Created temporary directory '{target_dir_path}'.")
        #
        print(f" *** Creating virtual environment...")
        venv_builder = EnvBuilder(with_pip=True)
        venv_builder.create(str(target_dir_path))
        venv_context = venv_builder.context
        #
        requirements = [
            'requests',]
        print(f" *** Installing {requirements}...")
        pip_install_command = [
            venv_context.env_exe,'-m','pip','install',*requirements,]
        subprocess.check_call(pip_install_command)
        #
        print(" *** Generating script...")
        script_substitutions = {
            'venv_executable': venv_context.env_exe,}
        script = (
            string.Template(SCRIPT_TEMPLATE).substitute(script_substitutions)
        )
        print(" *** Generated script:")
        print("'''")
        print(script)
        print("'''")
        #
        script_path = pathlib.Path(target_dir_path).joinpath('run.py')
        print(f" *** Writing script '{script_path}'")
        script_path.write_text(script)
        #
        print(" *** Executing script...")
        script_command = [
            venv_context.env_exe,str(script_path),]
        subprocess.check_call(script_command)

if __name__ == '__main__':
    main()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...