移动Python安装文件夹不会更新ipython路径

时间:2014-04-29 17:45:20

标签: python-2.7 ipython

我将Python 2.7安装从C:\ Python移动到D:\ Python只需移动文件夹(我知道还有其他方法可以做到这一点)。运行 D:\ Python \ python.exe 时,我可以导入系统库并运行而不会出现任何问题。但是,我无法运行 D:\ Python \ Scripts \ ipython.exe。我收到以下错误:

Fatal error in launcher: Unable to create process using '"C:\Python\python.exe" 
"D:\Python\Scripts\ipython.exe" '

似乎ipython知道它的原始安装目录C:\ Python,并尝试访问它。我可以使用任何启动选项或环境变量来强制ipython使用新的安装目录吗?

感谢。

修改

以下过程完全正常。我首先通过D:\ Python \ python.exe启动Python,然后运行:

import IPython
IPython.start_ipython()

为什么这与运行D:\ Python \ Scripts \ ipython.exe?

不同

3 个答案:

答案 0 :(得分:0)

关于pip,我遇到了这个问题,不得不将我的python安装升级到2.7.6并重新安装pip。

答案 1 :(得分:0)

我也遇到过这个问题。问题是pip在安装时硬编码了Scripts文件夹(在本例中为IPython)中可执行文件的Python解释器的路径。

我认为这不是控制哪个Python解释器pip应该用于可执行文件的方法。目前,Github上存在一些未解决的问题,表明这仍然是一个未解决的问题,例如: https://github.com/pypa/pip/issues/2845

但是,我发现此帖http://www.clemens-sielaff.com/create-a-portable-python-with-pip-on-windows/中描述的解决方法对我有用。基本上,只需在文本编辑器中打开exe文件并编辑Python解释器的路径(您将在文件的末尾找到它#!<your path>)。我正在使用#!python,因为我知道我选择的Python解释器将首先出现在路径中。

答案 2 :(得分:0)

我有一个非常相似的问题,因为我使用的是通过安装程序提供的便携式 python 应用程序。正如其他答案所示,.exe 中有一个硬编码路径,指向原始安装程序配置中的 python。

问题在于,使用此硬编码路径的不仅是 pip.exeipython.exejupyter.exe,而是 {{1} } 文件夹。就我而言,解决方案是不重新安装每个模块,因为这破坏了可移植包的想法。此外,这将需要额外的互联网资源,而用户可能无法使用这些资源。

解决方案是替换编译脚本本身中python.exe的路径。这是对我有用的解决方案,来自之前的 example

这是链接断开的代码:

.\python\Scripts

在python文件夹内调用:

"""
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)