python - Python:如何在临时目录创建虚拟环境并使用 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()
推荐阅读
- firebase - 如果我需要非登录用户能够读写,我该如何编写 Firebase 安全规则?
- java - 使用二进制序列查找字符的编码
- python - 在 Pandas DateTime 模块中设置明确的星期开始
- ibm-cloud - 用户没有属性“hf.AffiliationMgr”
- firebase - 网络上的 Firebase 身份验证内部错误“注册被阻止”
- javascript - 谷歌图 - 在 x 和 y 标签上拉伸图
- mysql - 用于简单多选的 mySQL 锁定
- terraform - 如何在不破坏和重新创建的情况下将资源移动到新的 tf 文件和状态?
- c - #define 具有多个值 - C
- macos - ESP-IDF 没有规则来制作目标`/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/9.0.0/include/limits.h'