假设我有一个任意大的、模块化的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脚本,它位于package
下的无限多个子模块中的一个子模块中
# foo.py:
from package.module2.submodule3 import foo
print foo.bar()
当从PyCharm运行脚本并使用Ctrl+F9
:no problem时,会打印foo.bar()
。
但是,当从Git Bash终端运行该脚本时,在主目录中使用以下命令:
python path/to/project/package/module4/submodule6/subsubmobile5/foo.py
抛出以下错误:
ImportError:没有名为package.module2.submodule3的模块
我想知道我需要做些什么才能让我的脚本在Git Bash上运行,以及为什么在PyCharm和Git Bash之间存在差异。是不是跟PYTHONPATH
有关
编辑:
sys.path.append()
hack的一些迭代。这些建议都不适用于我的情况。export PYTHONPATH=absolute/path/to/project/package
设置了一个.bashrc
文件,其中package
是我在PyCharm中的源根目录,但是仍然抛出了导入错误。相对路径也不起作用。我已经用echo $PYTHONPATH
验证了路径是正确的。export PYTHONPATH=absolute/path/to/project
同样也不能工作。编辑2个
该问题仍未解决,但可能与PYTHONPATH
在Git Bash上的设置不正确有关。当Add Content Roots to PYTHONPATH
未勾选时,PyCharm会抛出与Git Bash相同的导入错误。
发布于 2017-10-16 16:05:30
解决问题的正确方法是使用而不是来破解PYTHONPATH
,因为如果您的库/应用程序有第三方依赖项,这就没有用了。
为了正常工作,PyCharm使用了两个东西:
PYTHONPATH
中),要检查这一点,请在PyCharm中打开终端视图,然后尝试:
$ python
>>> import sys
>>> for p in sys.path:
... print(p)
...
正确的方法是使用virtualenv。
要在Windows上创建virtualenv,请转到要创建virtualenv的目录。它可以在一个唯一的目录中(就像pew推荐的那样),也可以在你的项目目录中(通常在.venv
中)。
virtualenv -p C:\Python27\python.exe yourvenv
然后,激活您的virtualenv并在开发/可编辑模式下安装您的应用程序:
yourvenv\Scripts\activate
cd path\to\project\
pip install -e .
在这里,您已经安装库/应用程序及其所有依赖项。-e
标志表示“可编辑”(与旧的“开发”模式相匹配),有关这一点,请参阅pip文档。
无论何时要运行脚本,都可以执行以下操作:
yourvenv\Scripts\activate
python -m package.module4.submodule6.subsubmobile5.foo
在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
发布于 2017-10-18 17:38:27
注意:如果您的应用程序/库具有第三方依赖项,则下面公开的解决方案将不起作用。为此,您需要一个。请参阅我的。
您在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路径,并使用正斜杠。
这样做的一种方法是:
$ 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
https://stackoverflow.com/questions/46688024
复制相似问题