繁体   English   中英

分发 python 代码,里面有 python 避免安装

[英]Distribute python code with python inside to avoid installation

我已经构建了一个捆绑的 Python 应用程序,它是一个已安装(即“ *.exe ”,通过pyinstaller )和一个代码(即“ *.py ”)部分的组合。 这是由于 package 不支持安装,因此我必须直接从源代码调用它。

我可以通过将我的环境包含在.\venv的捆绑包中并通过.\venv\Scripts\python.exe my_script.py运行代码来分发和运行应用程序,但是它需要在机器上安装 Python,从而引发错误否则

No Python at 'C:\Python38\python.exe' 

有没有办法在我的 package 中包含Python38文件夹,以允许任何人启动应用程序,无论是否安装了 Python(及其版本)? 我试图:

  • 在 package 和.\venv\Scripts\中复制Python38文件夹,希望.\venv\Scripts\python.exe在查看C:\ -> 之前那里搜索
  • 在我的 package 中包含Python38并强制将其复制到C:\作为第一条指令->它有效,但它似乎是作弊,它可能会在收件人的计算机上搞砸

我设法以某种简单的方式解决了这个问题:

  • 在我的 package 中包含Python38和我的venv (显然,它们会导致目标文件夹的大小增加,但对我来说这不是一个大问题)
  • 更新.\venv\pyvenv.cfg在我的计算机上从绝对路径更改为 Python 到目标文件夹内的相对路径

这里是对更新后的pyvenv.cfg的引用:

home = .\Python38                          <-- updated: it was "C:\Python38"
implementation = CPython
version_info = 3.8.5.final.0
virtualenv = 20.4.7
include-system-site-packages = false
base-prefix = .\Python38                   <-- updated
base-exec-prefix = .\Python38              <-- updated
base-executable = .\Python38\python.exe    <-- updated

仅供参考,这里是我用来自动更新pyvenv.cfg的代码,它适用于不同的 python 版本和路径:

import os
import re
from configparser import ConfigParser

# Set original and updated config paths
venv_cfg = 'pyvenv.cfg'
in_venv_cfg = os.path.join('.', 'venv', venv_cfg)
out_venv_cfg = os.path.join('.', 'config', venv_cfg)  # changing folder to avoid override of venv config

# Parse data in config
with open(in_venv_cfg, 'r') as f:
    config_lines = f.readlines()
config = ConfigParser()
config.read_string('[cfg]\n' + ''.join(config_lines))

# Get python version and location
py_path = config.get('cfg', 'home')
py_dir, py_name = os.path.dirname(py_path), os.path.basename(py_path)

# Update paths to python and save venv configuration
new_config_lines = [re.sub(r'(=\s*)' + py_dir.replace("\\", r"\\") + f'({py_name})', r'\1.\\\2', line) for line in config_lines]
with open(out_venv_cfg, 'w') as f:
    f.writelines(new_config_lines)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM