【问题标题】:PyCharm project path different from interactive session pathPyCharm 项目路径不同于交互式会话路径
【发布时间】:2017-06-09 00:13:21
【问题描述】:

在运行交互式会话时,PyCharm 将os.getcwd() 视为我的项目目录。但是,当我从命令行运行我的脚本时,PyCharm 将os.getcwd() 视为脚本的目录。

有没有好的解决方法?这是我尝试过但不喜欢的:

  • 进入运行/编辑配置并手动更改工作目录。我不喜欢这个解决方案,因为我必须为我运行的每个脚本都这样做。

  • 在我的代码中有一行“修复”用于交互式会话的路径,并在从命令行运行之前将其注释掉。这可行,但感觉不对。

有没有办法做到这一点,或者它只是应该的方式?也许我不应该尝试在我的项目中运行随机脚本?

任何见解将不胜感激。

澄清

  • “交互式会话”是指能够在 Python/IPython 控制台中单独运行每一行
  • “从命令行运行”是指创建脚本 my_script.py 并运行 python path_to_myscript/my_script.py(实际上我在 PyCharm 上按下了“运行”按钮,但我认为是一样的)。

其他值得一提的事实

  • 我创建了一个 PyCharm 项目。这包含(除其他外)包 Graphs,其中包含模块 Graph 和一些 .txt 文件。当我在我的 Graph 模块中做某事(例如从文件中读取图表)时,我喜欢测试事情是否按预期工作。我通过运行选择的行(以交互方式)来做到这一点。要读取 .txt 文件,我必须(使用 os.path.join())从当前工作目录(项目目录,...\\project_name)到文件所在的模块目录 ...\\project_name\\Graphs。但是,当我通过命令行运行整个脚本时,读取 .txt 文件的命令会引发错误,抱怨找不到文件。通过查看未找到的文件的名称,我看到完整的文件名是这样的: ...\\project_name\\Graphs\\Graphs\\graph1.txt 看来这次当前的工作目录是...\\project_name\\Graphs\\,而我的os.path.join() 命令居然把它弄坏了。

【问题讨论】:

  • 以下两个答案虽然提供了对问题的见解,但没有提供解决方案。你有没有找到一个解决方案,从 Shell 和交互式会话中给出相同的路径?
  • 不,不是。如果我必须对它做点什么,那就是包含一行测试如何调用脚本并相应地设置工作目录(即,如果通过命令行运行则没有更改,否则如果以交互方式运行,请将其设置为是项目的目录)。正如我上面所说,这可行,但感觉像是解决问题的业余方式。很高兴看到其他人分享我的问题! :)

标签: python-3.x path pycharm


【解决方案1】:

我在我的 python 脚本中使用了各种方法。

使用os.chdir(some_existing_path)将工作目录设置为代码的第一步

这意味着您的所有其他路径都应参考此路径,因为您很难设置路径。您只需要确保它可以在任何位置工作,并且特别是在您的 IDE 中。显然,另一个os.chdir() 会改变工作目录,os.getcwd() 会返回新的工作目录

使用os.chdir(os.path.dirname(__file__))将工作目录设置为__file__

这实际上是我用得最多的,因为它非常可靠,然后我将所有进一步的路径或文件操作都引用到它。或者您可以在代码中简单地引用 os.path.dirname(__file__) 而无需实际更改工作目录

使用os.getcwd()获取工作目录

并将所有路径和文件操作引用到此,知道它会根据脚本的启动方式而改变。 注意:不要假设这会返回脚本的位置,它会返回 shell 的工作目录!!

[根据新信息编辑]

“交互式会话”是指能够运行每一行 单独在 Python/IPython 控制台中

通过在 Python 控制台中以交互方式逐行运行,__file__ 没有被定义,毕竟:您没有执行文件。因此,您不能使用os.path.dirname(__file__),您必须使用os.chdir(some_known_existing_dir) 之类的东西来引用路径。作为程序员,您需要非常了解工作目录和对此的更改,您的代码应该反映这一点。

“从命令行运行”是指创建脚本 my_script.py 并运行 python path_to_myscript/my_script.py (我实际上按下 PyCharm 的运行按钮,但我认为是一样的)。

无论是从命令行执行 .py 还是在您的 IDE 中运行,都将填充 __file__,因此您可以使用 os.path.dirname(__file__)

HTH

【讨论】:

  • 感谢您的详细解答!请原谅我的菜鸟并详细说明几点:1)当我尝试os.chdir(__file__)(交互式)时,我收到错误消息:'__file__' not defined。我还需要做更多的事情吗? 2)我不明白粗体字的注释。我认为这很重要:)请详细说明。随意张贴引用而不是自己写下解释。
  • 我犯了一个小错误,现在已在上述答案中将其更正为os.chdir(os.path.dirname(__file__))。不过,这可能对您的问题没有帮助。我对 PyCharm 不熟悉,所以可能是 __file__ 没有定义。我建议阅读 PyCharm
  • 公平点。恐怕os.chdir(custom_path) 不是我想要的,因为包应该是可移植的。据我观察,__file__ 似乎不是在交互模式下定义的,而是在从命令行运行时定义的(可能不是 PyCharm 问题)。由于我想运行两次,这也行不通。你能解释一下shell的工作目录是什么吗?
  • 请更新您的帖子,以阐明“从命令行运行”和“交互模式”准确指定您运行脚本的方式,以便我们进一步帮助您...
  • 感谢您的更新。它提供了有关 python 路径设置方法以及__file__ 变量的宝贵见解。它唯一的问题是治疗对疾病同样有害(即手动设置路径同样糟糕,因为失去了可移植性)。这也是我创建项目而不是使用随机 .py 脚本的原因。我认为 PyCharm 可能有一些东西可以解决这个问题,但我找不到它。
【解决方案2】:

我特意在这篇文章中添加另一个答案,涉及以下方面:

其他值得一提的事实:

我创建了一个 PyCharm 项目。这包含(除其他外) 包 Graphs,其中包含模块 Graph 和一些 .txt 文件。当我在我的图表模块中做某事时(例如阅读图表 从文件中),我喜欢测试事情是否按预期工作。我这样做 通过运行选择的行(以交互方式)。要读取 .txt 文件, 我必须从当前工作目录中去(使用 os.path.join()) (项目目录,...\project_name)到模块的目录 ...\project_name\Graphs,文件所在的位置。然而,当我 通过命令行运行整个脚本,命令读取 .txt 文件引发错误,抱怨找不到文件。经过 查看未找到的文件的名称,我看到 完整的文件名是这样的: ...\project_name\Graphs\Graphs\graph1.txt 看来这次 当前工作目录是 ...\project_name\Graphs\,而我的 os.path.join() 命令实际上破坏了它。

我坚信,如果 python 脚本从任何文件中获取输入,那么脚本的作者需要在脚本中满足这一点。

我的意思是,无论脚本如何执行,作为作者的您都需要确保了解以下内容:

  • 什么是工作目录
  • 脚本目录是什么

当您将脚本交给其他人或在其他人的机器上运行时,您无法控制这两个。工作目录取决于脚本的启动方式。看来你是在 Windows 上运行的,所以这里举个例子:

C:\> c:\python\python your_script.py

如果your_script.pyC:\ 中,则工作目录现在为C:\

C:\some_dir\another_dir\> c:\python\python.exe c:\your_script_dir\your_script.py

工作目录现在是C:\some_dir\another_dir

如果将SYSTEM PATH变量设置为your_script.py所在位置的路径,上面的例子甚至会给出不同的结果

即使脚本的用户将脚本放置在他们机器上的不同位置,您也需要确保脚本能够正常工作。有些人(我不知道为什么)倾向于把所有东西都放在桌面上。您需要确保您的脚本可以处理此问题,包括路径名中的任何空格。

此外,如果您的脚本从文件中获取输入,作为作者的您需要确保您能够应对工作目录的变化,以及脚本目录的变化。您可以考虑以下几点:

  • 从已知(静态)目录输入脚本,例如C:\python_input\
  • 从已知(可配置)目录输入脚本,使用ConfigParser,您可以在stackoverflow 上搜索很多posts
  • 从与脚本位置相关的已知目录输入脚本(使用os.path.dirname(__file__)
  • 您可以采用的任何其他方法来确保您的脚本可以访问输入

最终这一切都在您的掌控之中,您需要编写代码以确保其正常工作。

HTH, 埃德温。

【讨论】:

  • 首先,我真诚地感谢您发布的不是一个,而是两个广泛的答案,我真的很感激。要评论答案,项目应该是一个有凝聚力的单元。只要我知道项目中的相对路径(我知道),它的路径是什么并不重要。话虽如此,我的问题是指 python/PyCharm 解释 相同的命令 os.getcwd() 以两种不同的方式,这取决于我是交互式运行还是从命令行运行在保持便携性的同时,我可以做些什么来避免这种情况。
猜你喜欢
  • 2014-01-04
  • 2014-04-29
  • 2023-04-08
  • 2014-01-09
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多