我有一个非常相似的问题,因为我使用的是通过安装程序提供的便携式 python 应用程序。正如其他答案所示,.exe 中有一个硬编码路径,它指向原始安装程序配置中的 python。
问题在于,使用此硬编码路径的不只是pip.exe、ipython.exe 或jupyter.exe,.\python\Scripts 文件夹中至少有 20 多个已编译的 exe 脚本。就我而言,解决方案是不要重新安装每个模块,因为这破坏了可移植包的想法。此外,这将需要额外的 Internet 资源,而用户可能无法使用这些资源。
解决方法是在编译脚本本身中替换python.exe的路径。这是对我有用的解决方案,来自以前的example:
这是链接中断的代码:
"""
Patch the distribution to make it portable
"""
import os
import sys
def win_patch_paths(folder, python_path, path_to_python="", fLOG=print):
"""
path are absolute when they are installed,
see `Create a portable Python with Pip on Windows <http://www.clemens-
sielaff.com/create-a-portable-python-with-pip-on-windows/>`_
:param folder: folder when to find the executable
:param python_path: python path (string to replace)
:param path_to_python: new python path (replace by)
:param fLOG: logging function
:return: list of tuple ('exe or py', 'modified file')
The first three parameter can be environment variables.
They will be replaced by their values.
"""
if isinstance(python_path, list):
operations = []
for pyt in python_path:
op = win_patch_paths(folder, pyt, path_to_python, fLOG)
operations.extend(op)
return operations
else:
if folder in os.environ:
folder = os.environ[folder]
if python_path in os.environ:
python_path = os.environ[python_path]
if python_path == "EMPTY_STRING":
python_path = ""
if path_to_python in os.environ:
path_to_python = os.environ[path_to_python]
files = os.listdir(folder)
if len(python_path) > 0 and not python_path.endswith("\\"):
python_path += "\\"
if len(path_to_python) > 0 and not path_to_python.endswith("\\"):
path_to_python += "\\"
operations = []
for prog in ["python.exe", "pythonw.exe"]:
shebang = "#!" + python_path + prog
bshebang = bytes(shebang, encoding="ascii")
into = "#!" + os.path.normpath(path_to_python + prog)
binto = bytes(into, encoding="ascii")
fLOG("replace {0} by {1}".format(shebang, into))
for file in files:
full = os.path.join(folder, file)
if os.path.isfile(full):
ext = os.path.splitext(full)[-1]
if ext in {".py", ""}:
with open(full, "r") as f:
content = f.read()
if shebang in content:
content = content.replace(shebang, into)
fLOG("update ", full)
operations.append(("update", full))
with open(full, "w") as f:
f.write(content)
elif ext == ".exe":
with open(full, "rb") as f:
content = f.read()
if bshebang in content:
content = content.replace(bshebang, binto)
fLOG("update ", full)
operations.append(("update", full))
with open(full, "wb") as f:
f.write(content)
else:
pass
return operations
if __name__ == '__main__':
folder = sys.argv[1]
old = sys.argv[2]
new = sys.argv[3]
print("folder:",folder)
print("old:",old)
print("new:",new)
op = win_patch_paths(folder=folder,python_path=old,path_to_python=new)
在 python 文件夹内调用:
# Python paths are only the path, not including the python.exe as the path
.\python.exe Scripts <old python path> <new python path>