如何在Windows批处理/Python文件中获取当前目录的路径?

2024-09-30 06:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题可能会让人困惑,我不是一个编码专家,所以希望我能正确地解释它

我有一个简单的windows批处理文件,用于运行python脚本。批处理文件如下所示:

cd C:\model\scripts
python run_project.py C:\2017to2021\Spruce2\button-down-president

因此,在将目录更改为保存python脚本的位置之后,run_project.py初始化水文模型,该模型使用路径C:\2017to2021\Spruce2\button-down-president的输入

问题是,我经常会设置许多不同的模型运行,每个运行都有一个到输入的唯一路径。通常,我只需将此批处理文件的一个库存版本直接复制到给定运行的路径,然后手动进入并用新的路径名更新它。因此,我会将上面的示例批处理文件复制到一个新目录,并手动将其转换为如下内容:

cd C:\model\scripts
python run_project.py C:\Documents\BAER_Roads\Modeling\Wepp_PEP\Runs\SingleStorm\NomeCreek

这样做已经足够好了,但它相当笨重,而且在更新到新路径名时很容易出错如果有一种方法可以让批处理文件自动更新到保存文件的目录的路径,我会很高兴的。这样我就可以将批处理文件粘贴到新模型输入的目录中,而无需手动打开文件并复制/粘贴新路径名

我不确定批处理文件是否可以在初始化python之前一起完成这项工作,或者python是否必须以某种方式查看用于初始化它的文件的路径?也许这根本不可能做到?也许我不知道我在说什么,应该把我的2美分留给自己

希望这个解释是相对清晰的。。。任何帮助都将不胜感激。对于知道自己在做什么的人来说,这可能很简单。但如果这还不明显的话,我可不是那种人


Tags: 文件runpy模型路径目录project脚本
3条回答

我建议采用更好的解决方案

首先使用以下命令行创建批处理文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Assign the folder path passed to batch file to environment variable FolderPath.
set "FolderPath=%~1"
rem Use the batch file path if started without a folder path argument.
if not defined FolderPath set "FolderPath=%~dp0"
rem Remove all double quotes from folder path.
set "FolderPath=%FolderPath:"=%"
if not defined FolderPath set "FolderPath=%~dp0"
rem Replace all slashes by backslashes in folder path.
set "FolderPath=%FolderPath:/=\%"
rem Make sure the folder path ends with a backslash.
if not "%FolderPath:~-1%" == "\" set "FolderPath=%FolderPath%\"
rem Check the existence of this folder and run Python on folder existing.
if exist "%FolderPath%" cd /D "C:\model\scripts" && python.exe "run_project.py" "%FolderPath%"
rem Restore the initial execution environment which includes the initial current directory.
endlocal

此批处理文件应存储在环境变量PATH中列出的其中一个文件夹中。在命令提示符窗口set path中运行PATHPATHEXT两个环境变量的输出,由cmd.exe使用上述命令行查找python.exe等可执行文件和批处理文件等脚本

然后,在将批处理文件复制到包含要处理的文件的文件夹中时,只需双击批处理文件即可运行该批处理文件,也可以在命令提示窗口中使用文件夹路径作为参数在命令提示窗口中输入,最好按照运行cmd /?时的用法帮助输出完成文件/文件夹名称在命令提示窗口中

但最有用的方法是右键单击最终文件夹中的批处理文件,然后在菜单项桌面(创建快捷方式)的上下文子菜单中左键单击发送到。接下来,选择在用户桌面上创建的快捷方式文件,用Ctrl+X剪切并用Ctrl+V粘贴到文件夹%APPDATA%\Microsoft\Windows\SendTo中,该文件夹通常会扩展到类似C:\Users\UserName\AppData\Roaming\Microsoft\Windows\SendTo的地方

这使得可以在Windows文件资源管理器中的任何文件夹上单击鼠标右键,并根据快捷方式文件的名称在子菜单中打开的上下文菜单中单击鼠标左键“发送到”,以右键单击的文件夹的完全限定文件夹名称作为Windows传递的第一个参数启动批处理文件将文件资源管理器添加到批处理文件。因此,批处理文件可用于任何文件夹,而无需在批处理文件周围进行复制或在命令提示窗口中手动输入文件夹路径

即使在命令提示符窗口中手动输入文件夹路径时使用错误,批处理文件也尽可能具有故障保护功能,但在运行批处理文件时,此参数可能不正确。也可以从另一个批处理文件调用批处理文件,而不影响父批处理文件环境

可以删除以rem开头的命令行,因为这些只是解释代码的注释

为了理解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • call /?。。。解释%~dp0%~1
  • cd /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

另请参见single line with multiple commands using Windows batch file,以了解只有在将当前目录更改为C:\model\scripts成功时才运行&&的运算符python.exe的说明,该操作应该不会失败,但谁能保证将来的数据

我脑海中的问题是,为什么要费心将cd刻录到包含run_project.py的目录中

你为什么认为这是必要的?如果不这样做,那么似乎不需要数据文件的绝对路径

只用

python C:\model\scripts\run_project.py button-down-president

通常,为了避免常见执行项的路径问题,可以将这些项安装到路径中的一个文件夹中。例如,如果打开“Anaconda Prompt”并运行命令“openssl”,它将运行而不关心您所在的目录。这是因为Anaconda将openssl安装到文件夹…/Anaconda3/Library/bin中,并将此路径添加到系统查找的路径中。你也可以自己做

  1. 创建文件夹,比如C:\Scripts
  2. 将所述文件夹添加到系统路径或PYTHONPATH。Windows菜单,运行,键入“systempropertiesadvanced”,弹出菜单,单击环境变量。如果愿意,现在可以添加另一条路径
  3. 将run_project.py文件放到文件夹中
  4. 打开任何终端并键入“python run_project.py”,无论终端位于何处

相关问题 更多 >

    热门问题