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

2024-04-04

假设我有一个任意大的模块化 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 模块。它包含许多子目录,每个子目录都是一个名为的Python模块moduleN.
  • Each project\package\moduleNmodule包含许多子目录,每个子目录都是一个名为的Python模块submoduleN... 等等等等。

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

# foo.py:

from package.module2.submodule3 import foo
print foo.bar()

当脚本运行时PyCharm with Ctrl+F9: 没问题,foo.bar() prints.

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

python path/to/project/package/module4/submodule6/subsubmobile5/foo.py

抛出以下错误:

导入错误:没有名为 package.module2.submodule3 的模块


我想知道我需要做什么才能让我的脚本在 Git Bash 上运行,and为什么 PyCharm 和 Git Bash 之间首先存在差异。是不是有什么关系PYTHONPATH?


EDIT:

  • ManyStackOverflow 答案建议使用一些迭代sys.path.append()黑客。这些建议都不适合我的情况。
  • 我设置了一个.bashrc文件与export PYTHONPATH=absolute/path/to/project/package, where package是我在 PyCharm 中的源根,但仍然抛出导入错误。相对路径也不起作用。我已经验证路径是否正确echo $PYTHONPATH. export PYTHONPATH=absolute/path/to/project同样不起作用。
  • 工作目录似乎并不重要 - 无论工作目录如何,Git Bash 每次都会失败,而无论工作目录如何,PyCharm 每次都会工作。

EDIT 2:

该问题仍未解决,但可能与PYTHONPATH在 Git Bash 上没有正确设置。什么时候Add Content Roots to PYTHONPATH is unticked,PyCharm 会抛出与 Git Bash 相同的导入错误。


解决你的问题的正确方法是not破解PYTHONPATH,因为如果您的库/应用程序具有第三方依赖项,这将没有用。

为了正常工作,PyCharm 使用了两件事:

  • 源根(添加到PYTHONPATH), and,
  • 项目解释器(即 virtualenv),

要检查这一点,请在 PyCharm 中打开终端视图,然后尝试:

$ python
>>> import sys
>>> for p in sys.path:
...     print(p)
...

正确的方法是使用虚拟环境 https://virtualenv.pypa.io/en/stable/.

要在 Windows 上创建 virtualenv,请转到要创建 virtualenv 的目录。 它可以位于一个唯一的目录中(如推荐的pew https://pypi.python.org/pypi/pew/), 或在您的项目目录中(通常在.venv).

virtualenv -p C:\Python27\python.exe yourvenv

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

yourvenv\Scripts\activate

cd path\to\project\
pip install -e .

在这里,您已经安装了库/应用程序及其所有依赖项。 这-eflag 表示“可编辑”(与旧的“开发”模式匹配), 看pip https://pip.pypa.io/en/stable/reference/pip_install/相关文档。

每当您想运行脚本时,您可以执行以下操作:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 脚本在 PyCharm 中运行,但不在 Git Bash 中运行 的相关文章

  • 如何在算术表达式的结果上添加 SQLAlchemy 标签?

    我如何将这样的东西翻译成 SQLAlchemy select x y as difference 我知道该怎么做 x label foo 但我不确定在哪里放置下面的 label 方法调用 select table c x table c y
  • 无法将 datetime.datetime 与 datetime.date 进行比较

    我有以下代码并收到上述错误 由于我是 python 新手 我无法理解这里的语法以及如何修复错误 if not start or date lt start start date 有一个datetime date 从日期时间转换为日期的方法
  • Pytest:如何使用从夹具返回的列表来参数化测试?

    我想使用由固定装置动态创建的列表来参数化测试 如下所示 pytest fixture def my list returning fixture depends on other fixtures return a dynamically
  • 无法安装时间模块

    我试过了pip install time and sudo H pip install time 但我不断收到错误 找不到满足要求时间的版本 从 版本 未找到时间匹配的发行版 我正在 PyCharm 中工作 但真正没有意义的是我可以在 Py
  • 如何从网站中提取冠状病毒病例?

    我正在尝试从网站中提取冠状病毒 https www trackcorona live https www trackcorona live 但我得到了一个错误 这是我的代码 response requests get https www t
  • 为 PyCharm 中的所有配置设置相同的环境变量

    我有一个与 Celery 和很多不同的工作人员一起的项目 如何避免每次将 PyCharm 中的环境变量复制粘贴到每个运行 调试配置 有什么方法可以在项目设置中设置它们吗 找到解决方案here https stackoverflow com
  • 远程控制或脚本打开 Office 从 Python 编辑 Word 文档

    我想 最好在 Windows 上 在特定文档上启动 Open Office 搜索固定字符串并将其替换为我的程序选择的另一个字符串 我该如何从外部 Python 程序中做到这一点 OLE 什么 原生 Python 脚本解决方案 The doc
  • 在python中调用subprocess.Popen时“系统找不到指定的文件”

    我正在尝试使用svnmerge py合并一些文件 它在底层使用 python 当我使用它时 我收到一个错误 系统找不到指定的文件 工作中的同事正在运行相同版本的svnmerge py 以及 python 2 5 2 特别是 r252 609
  • 一起使用 Argparse 和 Json

    我是 Python 初学者 我想知道 Argparse 和 JSON 是否可以一起使用 说 我有变量p q r 我可以将它们添加到 argparse 中 parser add argument p param1 help x variabl
  • 如何检查包含 NaN 的列表 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在我的 for 循环中 我的代码生成一个如下所示的列表 list 0 0 0 0 sum 0 0 0 0 该循环生成所有其他数字向量 但它也
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 别碰我的女人

    我讨厌的一件事迪斯图尔斯 http docs python org distutils 我猜他是邪恶的人 他这样做了 https github com python cpython blob 300dd552b15825abfe0e367a
  • AWS Lambda python API 调用方法不返回 JSON - 不可序列化?

    我有一个 Lambda 函数 它是对 API 的基本 Python GET 调用 它在本地运行良好 但是当我上传到 Lambda 以及请求库 时 它不会从 API 调用返回 JSON 响应 我只是希望它将整个 JSON 对象返回给调用者 我
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • 如何将reportlab与Google应用程序引擎一起使用

    我无法在谷歌应用程序引擎下正确导入reportlab 根据以下guide http blog notdot net 2010 04 Generating PDFs on App Engine Python and introducing M
  • Docker 日志中的 Python 异常标记为流:stdout

    我想解析和处理来自 docker 容器的所有错误 但当我期望 stderr 时 Python 异常标记为 stdout 举个简单的例子app py raise Exception 然后我在 docker 容器中运行这个文件 但在 var l
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • Python 中的迭代器 (iter()) 函数。 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 对于字典 我可以使用iter 用于迭代字典的键 y x 10 y 20 for val in iter y print val 当

随机推荐