Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本在PyCharm中运行,但在Git Bash中不运行_Python_Python 2.7_Pycharm_Git Bash - Fatal编程技术网

Python脚本在PyCharm中运行,但在Git Bash中不运行

Python脚本在PyCharm中运行,但在Git Bash中不运行,python,python-2.7,pycharm,git-bash,Python,Python 2.7,Pycharm,Git Bash,假设我有一个任意大的模块化Python 2.7代码库: project ↳ docs ↳ etc ↳ package ↳ module1 ↳ submodule1 ↳ subsubmodule1 ↳ __init__.py ↳ subsubmodule2 (... and so on) ↳ __init__.py ↳ submodule2 ↳ subsubmodule1 ↳ __init__.py

假设我有一个任意大的模块化Python 2.7代码库:

project
↳ docs
↳ etc
↳ package
  ↳ module1
    ↳ submodule1
      ↳ subsubmodule1
        ↳ __init__.py
      ↳ subsubmodule2 (... and so on)
      ↳ __init__.py
    ↳ submodule2
      ↳ subsubmodule1
        ↳ __init__.py
      ↳ subsubmodule2 (... and so on)
      ↳ __init__.py
    ↳ submodule3 (... and so on)
      ↳ __init__.py
  ↳ module2
    ↳ submodule1
      ↳ __init__.py
    ↳ submodule2 (... and so on)
      ↳ __init__.py
    ↳ __init__.py        
  ↳ module3 (... and so on)
    ↳ __init__.py
  ↳ __init__.py
↳ test
  • project
    是根文件夹-它是PyCharm项目,不是模块
  • project\package
    是项目的根Python模块。它包含许多子目录,每个子目录都是一个名为
    moduleN
    的Python模块
  • 每个
    project\package\moduleN
    模块都包含许多子目录,每个子目录都是一个名为
    submoduleN
    的Python模块。。。等等等等

假设我想运行一个名为
foo.py
的Python脚本,它位于
下无限多个子模块中的一个子模块中:

# foo.py:

from package.module2.submodule3 import foo
print foo.bar()
当脚本从PyCharm运行时,使用
Ctrl+F9
:没问题,
foo.bar()
打印

但是,当脚本从Git Bash终端、主目录运行时,使用:

python path/to/project/package/module4/submodule6/subsubmobile5/foo.py
将引发以下错误:

ImportError:没有名为package.module2.submodule3的模块


我想知道我需要做什么才能让我的脚本在Git Bash上运行,以及为什么PyCharm和Git Bash之间首先存在差异。这与PYTHONPATH有关吗


编辑

  • 许多StackOverflow答案建议使用一些迭代的
    sys.path.append()
    hacks。这些建议在我的情况下都不起作用
  • 我使用
    export PYTHONPATH=absolute/path/to/project/package
    设置了一个
    .bashrc
    文件,其中
    package
    是我在PyCharm中的源根目录,但仍然抛出导入错误。相对路径也不起作用。我已经用
    echo$PYTHONPATH
    验证了路径是否正确
    export PYTHONPATH=absolute/path/to/project
    同样不起作用
  • 工作目录似乎无关紧要——Git Bash每次都会失败,不管工作目录是什么,PyCharm每次都会工作,不管工作目录是什么
编辑2


这个问题仍然没有解决,但可能与Git Bash上的
PYTHONPATH
设置不正确有关。当
将内容根添加到PYTHONPATH
被取消勾选时,PyCharm会抛出与Git Bash相同的导入错误。

解决问题的正确方法是而不是破解
PYTHONPATH
,因为如果您的库/应用程序具有第三方依赖关系,这将没有用处

为了正常工作,PyCharm使用了两种方法:

  • 源根目录(添加到
    PYTHONPATH
    ),以及
  • 项目口译员(即virtualenv)
要进行检查,请在PyCharm中打开终端视图,然后尝试:

$ python
>>> import sys
>>> for p in sys.path:
...     print(p)
...
正确的方法是使用一个

要在Windows上创建virtualenv,请转到要在其中创建virtualenv的目录。 它可以位于唯一的目录中(如推荐的), 或者在项目目录中(通常位于
.venv

然后,激活virtualenv并以开发/可编辑模式安装应用程序:

yourvenv\Scripts\activate

cd path\to\project\
pip install -e .
在这里,您已经安装了库/应用程序及其所有依赖项。
-e
标志表示“可编辑”(与旧的“开发”模式匹配), 请参阅相关文档

无论何时要运行脚本,都可以执行以下操作:

yourvenv\Scripts\activate
python -m package.module4.submodule6.subsubmobile5.foo
$ export PYTHONPATH=path/to/project && python path/to/project/package/module4/submodule6/subsubmobile5/foo.py
在Windows上,您还可以执行以下操作:

yourvenv\Scripts\activate
python path\to\project\package\module4\submodule6\subsubmobile5\foo.py
在Git bash上,您可以执行以下操作:

source yourvenv/Scripts/activate
python path/to/project/package/module4/submodule6/subsubmobile5/foo.py
如果要从另一批调用Python脚本,可以执行以下操作:

yourvenv/Scripts/python.exe -m package.module4.submodule6.subsubmobile5.foo
yourvenv/Scripts/python.exe path/to/project/package/module4/submodule6/subsubmobile5/foo.py
注意:如果您的应用程序/库具有第三方依赖项,则下面公开的解决方案将不起作用。要做到这一点,你需要一份工作。看我的

path\to\project
中有以下树结构:

path\to\project
├───docs
├───etc
├───package
│   │   __init__.py
│   ├───module1 [...]
│   ├───module2
│   │   │   __init__.py
│   │   ├───submodule1 [...]
│   │   ├───submodule2 [...]
│   │   └───submodule3
│   │           foo.py
│   │           __init__.py
│   ├───module3 [...]
│   └───module4
│       │   __init__.py
│       └───submodule6
│           │   __init__.py
│           └───subsubmobile5
│                   foo.py
│                   __init__.py
└───tests
这里,
package
是项目的根Python包,
path\to\project
是项目源目录(PyCharm使用的目录)

要在此包中运行脚本,例如脚本
package/module4/submodule6/subsubmobile5/foo.py
,需要将
PYTHONPATH
设置为项目的根,即
path\To\project

但是,由于您在Windows上运行Git Bash,因此需要使用正斜杠将Windows路径转换为有效的Linux路径

一种方法如下:

yourvenv\Scripts\activate
python -m package.module4.submodule6.subsubmobile5.foo
$ export PYTHONPATH=path/to/project && python path/to/project/package/module4/submodule6/subsubmobile5/foo.py
您甚至可以执行模块
package.module4.submodule6.subsubmobile5.foo

$ export PYTHONPATH=path/to/project && python -m package.module4.submodule6.subsubmobile5.foo
最终,他帮助我解决了这个问题

我用过:

    import sys
    for p in sys.path:
        print(p)
帮助我确定PyCharm上添加到PYTHONPATH的内容与Git Bash之间确实存在差异。在PyCharm上,
/path/to/project
/path/to/project/package
添加到
PYTHONPATH
。在GitBash上,只添加了一个

因此,我修改了
.bashrc
中的
export
语句,使其将两条路径附加到
PYTHONPATH
;i、 e.来自:

export PYTHONPATH=“${PYTHONPATH}:绝对/path/to/project/package”

致:

export PYTHONPATH=“${PYTHONPATH}:absolute/path/to/project:absolute/path/to/project/package”

然后解决了导入错误。1类似地,当类似地声明了
路径
PYTHONPATH
用户环境变量时,脚本在Windows命令提示符上按预期工作

我的最佳猜测是,将PyCharm中的源根目录设置为项目目录以外的其他目录可能需要多次添加到
PYTHONPATH

1在一个站点上注意:然后我的脚本开始无限期地挂起,这是通过给Python取别名来解决的:
alias Python=“winpty Python”

编辑:

Git Bash在MinGW64下运行,在MinGW64下,
export
语句中的Windows路径列表在被Python的导入解析处理之前要进行修改

所以技术