Python脚本在PyCharm中运行,但在Git Bash中不运行
假设我有一个任意大的模块化Python 2.7代码库: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
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
是根文件夹-它是PyCharm项目,不是模块李>project
是项目的根Python模块。它包含许多子目录,每个子目录都是一个名为project\package
的Python模块李>moduleN
- 每个
模块都包含许多子目录,每个子目录都是一个名为project\package\moduleN
的Python模块。。。等等等等submoduleN
假设我想运行一个名为
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答案建议使用一些迭代的
hacks。这些建议在我的情况下都不起作用sys.path.append()
- 我使用
设置了一个export PYTHONPATH=absolute/path/to/project/package
文件,其中.bashrc
是我在PyCharm中的源根目录,但仍然抛出导入错误。相对路径也不起作用。我已经用package
验证了路径是否正确echo$PYTHONPATH
同样不起作用export PYTHONPATH=absolute/path/to/project
- 工作目录似乎无关紧要——Git Bash每次都会失败,不管工作目录是什么,PyCharm每次都会工作,不管工作目录是什么
这个问题仍然没有解决,但可能与Git Bash上的
PYTHONPATH
设置不正确有关。当将内容根添加到PYTHONPATH
被取消勾选时,PyCharm会抛出与Git Bash相同的导入错误。解决问题的正确方法是而不是破解PYTHONPATH
,因为如果您的库/应用程序具有第三方依赖关系,这将没有用处
为了正常工作,PyCharm使用了两种方法:
- 源根目录(添加到
),以及PYTHONPATH
- 项目口译员(即virtualenv)
$ 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的导入解析处理之前要进行修改
所以技术