当运行当前文件时(通过PyCharm的“run current file”动作),它将工作目录设置为/Users/xxx/Documents/myproject/xy
文件夹(文件路径为/Users/xxx/Documents/myproject/xy/myfile.py
)。
然而,我希望工作目录是/Users/xxx/Documents/myproject/
文件夹,我不明白为什么它自动使用python文件所在的目录,而不是我实际指定的工作目录。
主要问题来自Python文件中的这行代码:
df = pandas.read_csv("output/file.csv")
有一个/Users/xxx/Documents/myproject/output/file.csv
但是它无法打开它,因为它在“xy”文件夹中查找,而不是“output/file.csv”的“myproject”文件夹。我当然可以做类似pandas.read_csv("../output/file.csv")
的操作
但每次我重构代码并将文件移到不同的文件夹时,它就会被破坏。难道不可能在pycharm中有一个一致的工作目录,无论我在项目中运行什么文件?
另外:由于某种原因,此导入:从lib.mylibrary import somefunction
工作,即使该文件保存在/Users/xxx/Documents/myproject/lib/mylibrary.py
中
所以对于导入,它似乎是从工作目录搜索的。然而,对于任何其他东西,这并不发生。为什么?导入和其他代码有不同的工作目录吗?
3条答案
按热度按时间gcuhipw91#
当创建一个新的项目时,PyCharm创建一个虚拟环境。pip安装都只安装在这个本地项目文件夹中,工作文件夹被设置为根项目文件夹。
如果你打开文件夹而不创建项目,我可以想象默认为python的默认位置,根文件夹可以设置到错误的位置。
1.我建议使用虚拟环境(从设置-〉项目-〉项目解释器设置)
1.您可以在PyCharm的右上角设置工作目录、参数和执行的python脚本-〉通常使用python文件名-〉然后编辑配置
vcirk6k62#
我发现依赖隐式工作目录在脚本中是不好的做法,除非它专门用于运行各种工作目录。
相反,我设置了相对于脚本本身的路径:
无论您从何处运行文件,这都更加一致。
另一种选择是简单地将文件路径作为脚本的CLI参数,并使用类似于docopt的方法读取它,这样就不必处理工作目录。
还有一种可能性是从STDIN(
sys.stdin
)读取,而不是从文件读取:我认为Pandas支持这一点,但只有当你只阅读一个文件时,它才起作用。
所以对于导入,它似乎是从工作目录搜索的。然而,对于任何其他东西,这并不发生。为什么?导入和其他代码有不同的工作目录吗?
导入与工作目录不同。当您从shell运行脚本时,可能会出现如下内容(假设您将shell配置为显示当前工作目录):
在本例中,
/home/ookami/Documents
是当前目录,也称为工作目录,也称为PWD
环境变量(由shell管理)。~/code/my_script.py
也称为/home/ookami/code/my_script.py
是脚本的绝对路径。如果脚本尝试从output/file.csv
读取,则实际上是$PWD/output/file.csv
也称为/home/ookami/Documents/output/file.csv
。这当然是一种古老的Unix机制,允许您在不同的位置有多个
output/file.csv
,并允许您根据shell所在的目录来确定将读取哪个。当您在shell上使用像Pycharm这样的GUI抽象时,它开始失去意义并导致混乱。我建议您不要使用Pycharm的“运行”特性,并且习惯于从命令行运行Python脚本,从长远来看,这将为您节省很多麻烦。当您使用它时,请阅读“Unix哲学”,它将启发您并教您编写更优雅的程序。另一方面,导入并不依赖于你运行脚本的位置。它们通常是相对于脚本本身(
__file__
)或绝对路径(你的系统库)。它们来自PYTHONPATH
,Python文档对此有解释。ie3xauqp3#
右键单击
myfile.py
,然后单击Modify Run Configuration...
将
Working directory:
更改为C:\Users\xxx\Documents\myproject
,然后单击OK
。现在试着运行它。