为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2023-06-06 10:16:33
我想创建一个临时文件并编写一个 python 脚本。我想在此临时目录中创建一个虚拟环境并使用 pip,然后在虚拟环境中运行此脚本。import pathlibimport tempfile import venvtemp = 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"])
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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


#!/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()


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信