PyCharm项目路径与交互式会话路径不同

时间:2017-01-24 09:07:29

标签: python-3.x path pycharm

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

这有一个很好的解决方法吗?这是我尝试过但不喜欢的:

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

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

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

非常感谢任何见解。

澄清

  • 通过"交互式会话"我的意思是能够在Python / IPython控制台中单独运行每一行
  • 通过"从命令行运行"我的意思是创建一个脚本my_script.py并运行python path_to_myscript/my_script.py(我实际按下PyCharm上的Run按钮,但我认为它是相同的。)

其他可能值得一提的事实

  • 我创建了一个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()命令实际上破坏了它。

2 个答案:

答案 0 :(得分:1)

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

  

使用os.chdir(some_existing_path)

将工作目录设置为代码的第一步

这意味着您应该引用所有其他路径,因为您需要设置路径。您只需要确保它可以在任何位置工作,并且您可以在IDE中专门工作。显然,另一个os.chdir()将更改工作目录,os.getcwd()将返回新的工作目录

  

使用__file__

将工作目录设置为os.chdir(os.path.dirname(__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 :(得分:1)

我故意在这篇文章中添加另一个答案,关于以下内容:

  

其他可能值得一提的事实:

     

我创建了一个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()命令实际上破坏了它。

我坚信,如果python脚本从任何文件中获取输入,那么脚本的作者需要在脚本中为此提供服务。

我的意思是你,因为无论你的脚本如何执行,作者都需要确保你知道以下内容:

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

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

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

如果C:\位于your_script.py

,工作目录现在为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,您可以在很多posts上的stackoverflow上搜索
  • 从与脚本位置相关的已知目录输入脚本(使用os.path.dirname(__file__)
  • 您可能采用的任何其他方法,以确保您的脚本可以进入输入

最终,这一切都在您的掌控之中,您需要进行编码以确保其正常运行。

HTH, 埃德。