[英]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(及其版本)? 我試圖:
.\venv\Scripts\
中復制Python38
文件夾,希望.\venv\Scripts\python.exe
在查看C:\
-> 之前在那里搜索Python38
並強制將其復制到C:\
作為第一條指令->它有效,但它似乎是作弊,它可能會在收件人的計算機上搞砸我設法以某種簡單的方式解決了這個問題:
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.