关于python:bash shell将当前文件的路径存储为变量?

bash shell store path to current file as variable?

本问题已经有最佳答案,请猛点这里访问。

在python中启动项目时,我想将一些环境变量保存在名为environment_variables的文件中,并在bashrc中源代码这个文件。

文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
username=$(whoami)

# project root path
export PROJECT_DIR='/home/'$username'/nuclei_segmentation/'

# project data path
export DATA_DIR=$PROJECT_DIR"data/"

# location of models
export MODEL_DIR=$PROJECT_DIR"models/"

# project output data
export OUTPUT_DIR=$PROJECT_DIR"output/"

我想更改PROJECT_DIR路径,使其与平台/名称无关。所以这个environment_variables文件将始终在项目的根目录中,我想将PROJECT_DIR设置为始终是environment_variables文件的位置。

我以为我可以用PWD来完成这个任务,但是当从bashrc调用时,这会产生一个错误,我还想到了一个使用find从根目录中搜索文件的解决方案,但是这看起来很复杂,并且认为必须有更好的方法?


如果我完全理解你想去哪里,我的建议是

  • 使代码尽可能地脱离当前目录。
  • 如果可以避免的话,不要在用户环境中乱丢多个变量。
  • 如果你必须有环境变量,给它们一个名称,清楚地传达它们与什么相关。

在一些更具体的例子中,命名项目根目录的单个变量应该是您真正需要的。如果预期的文件在当前目录中,则不需要设置它。

1
export NUC_SEG_DIR=$HOME/nuclei_segmentation

在python代码中,输入合理的默认值。在这种特殊情况下,希望os.path.join(os.environ['NUC_SEG_DIR'], 'data')指向您的data目录等。如果用户想覆盖它,使用符号链接就足够容易了。确保这在代码中是参数化的,这样如果您希望在将来配置它,可以在一个地方轻松重写。可能有点像

1
2
3
4
def nuc_seg(root_dir=os.environ['NUC_SEG_DIR'], data_dir='./data', model_dir='./models', output_dir='./output'):
    if root_dir == '':
        root_dir='.'
    ... your code here

也许稍后,让您的命令行界面允许用户通过命令行选项或配置文件来重写这些值。

同样,不需要用户编辑他们的.bash_profile或类似的东西——如果他们想在不同的目录中运行多个实验,或者其他什么?他们可以弄清楚如何使环境变量成为永久变量,或者,如果您的用户不希望熟悉shell的基础知识,您甚至可以将其作为一个选项记录下来。


在脚本文件中使用dirname $0查找当前脚本文件所在的目录