【问题标题】:cwd being added to pathcwd 被添加到路径
【发布时间】:2019-09-17 10:50:03
【问题描述】:

我有一个布局如下的文件夹:

root/
    package0/
       __init__.py
       main.py
    package1/
       __init__.py
       main.py

package1/main.py里面我有import package0

当我在 root 文件夹上打开终端并运行 python package1/main.py 时,它工作正常。但这很奇怪,因为 cwd 不应该包含在路径中,只有脚本所在的文件夹,在这种情况下是 package1。 当我打印sys.path 时,我可以看到根文件夹在那里。

当我在另一台计算机上运行相同的代码时,我得到了预期的导入错误。

我不明白为什么我会看到这种行为。 我已经检查了 .bashrc 并且没有将 cwd 添加到 python 路径的代码。 两台计算机上可能有什么不同,我正在通过 git 将根文件夹从一台计算机转移到另一台计算机。

【问题讨论】:

  • 如果它们是真正独立的包,您可能希望将“package0”安装“package0”到“package1”的开发环境中,而不是像这里所做的那样将它们保持在同一级别.如果它们不需要分开,只需添加一个具有“package0”的父包,并且“package1”是顶级父包的子包。
  • 我同意这一点。关键是 package1 是一个文件夹,其中包含一些不应该安装的命令行实用程序,它们依赖于 package0。关键是我在两台机器上得到了不同的行为,我不知道为什么。
  • 好的,是的,cwd 应该取决于您执行命令的位置。正如@Enthus3d 提到的,如果您在root/ 目录级别执行命令,both 包应该在您的 PATH 中。

标签: python python-3.x


【解决方案1】:

基本上,每当您启动特定脚本时,'working directory' 就是您启动该脚本的目录。当您使用命令行从根文件夹运行脚本时,脚本将查找您提到的任何文件,根文件夹作为任何路径的“根”。

希望这能解决您的一些问题。如果您对更改起始目录感兴趣,可以阅读更多相关信息here

编辑:继续讨论如何解决更改任何特定文件的工作目录,这应该获取您当前正在运行的文件的目录,更改它的路径,然后将目录更改为更高。

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))
os.chdir(dir_path)
os.chdir("..")

【讨论】:

  • 谢谢,我总是从根文件夹运行脚本。问题是在这台计算机上,cwd 总是在 sys.path 中。在我的另一台没有发生的计算机上,我收到一个导入错误,因为我研究过这应该是默认行为。现在我得到了在不同计算机上运行不同的代码,所以我不知道如何正确布局代码。
  • 哦,我明白了。我以为你是出于好奇而问的。因此,您希望格式化代码以使其始终正常运行,无论脚本从何处运行?
  • 让我在我的电脑上尝试一下,我想我可以帮助你。
  • 非常感谢。我想要一个可以克隆的存储库,在这个存储库中有一个包和一些依赖于这个包的单独文件夹中的脚本。我希望有人能够在不安装软件包的情况下运行这些脚本。问题是它在这台计算机上的工作方式。另一方面,如果我不手动将根文件夹添加到每个脚本开头的路径,我会收到导入错误。
  • 一个好方法是使用os.chdir('Path to your root directory'),但我正在尝试弄清楚我们如何为现在使用您的存储库的任何用户执行此操作。
【解决方案2】:

我找到了解决方案。我不知道为什么这解决了这个问题。 我在.bashrc 上的pythonpath 中添加了两个文件夹,一些TensorFlow 的东西,与此任务无关。 当我评论添加这些文件夹的行时,我的 cwd 停止添加到 pythonpath。我查看了这些文件夹,但我无法弄清楚是什么原因造成的。 反正我还是很好奇。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2015-06-13
    • 2022-07-05
    相关资源
    最近更新 更多