Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重定向到文件时发生批处理错误_Python_Batch File_Error Handling - Fatal编程技术网

Python 重定向到文件时发生批处理错误

Python 重定向到文件时发生批处理错误,python,batch-file,error-handling,Python,Batch File,Error Handling,我正在将Python脚本的输出重定向到一个文件。 如果没有错误,它可以正常工作。 但是,如果有任何错误,我希望在另一个文件中捕获该错误,而该文件现在没有发生 下面是我写的剧本 @echo off mode con cp select=65001 set dt=%Date:~10,4%-%Date:~4,2%-%Date:~7,2% cd C:\API_DOC\softeon_project\script python -u softeon_main.py >>C:\API_DOC\

我正在将Python脚本的输出重定向到一个文件。 如果没有错误,它可以正常工作。 但是,如果有任何错误,我希望在另一个文件中捕获该错误,而该文件现在没有发生

下面是我写的剧本

@echo off
mode con cp select=65001
set dt=%Date:~10,4%-%Date:~4,2%-%Date:~7,2%

cd C:\API_DOC\softeon_project\script
python -u softeon_main.py >>C:\API_DOC\softeon_project\log\log_%dt%.txt 2>>C:\API_DOC\softeon_project\log\logerr_%dt%.txt 
echo "after python path"
pause
exit

任何帮助都是值得的。

动态环境变量
日期的使用取决于为当前使用的用户帐户定义的Windows区域设置

例如,在2017年12月26日星期二运行时,将
echo%DATE%
写入命令提示窗口,可以使用

set "dt=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%"
或者更好

set "dt=%DATE:~-4%-%DATE:~-10,2%-%DATE:~-7,2%"
这两个命令行都使用字符串替换来获取使用字符串定义的环境变量
dt
。不同之处在于,第一个命令行从左侧引用日期字符串中的字符,而第二个命令行从右侧引用它们。因此,第二个命令行在开始时也不使用缩写的工作日

在命令提示符窗口中运行
SET/?
时,命令SET的帮助输出解释了此处使用的字符串替换

yyyy-MM-dd
格式获取当前本地日期的独立于区域的解决方案是:

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "dt=%%I"
set "dt=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%"
有关此变体的详细说明,请参见

缺点是WMIC输出本地日期和时间需要一秒钟以上,这使得此解决方案比使用动态环境变量
date
的解决方案慢得多

我建议使用:

@echo off
rem Define encoding UTF-8 for console.
%SystemRoot%\System32\mode.com CON CP SELECT=65001

rem Get current local date in format yyyy-MM-dd.
set "dt=%DATE:~-4%-%DATE:~-10,2%-%DATE:~-7,2%"

rem Change the current directory independent on current drive.
cd /D C:\API_DOC\softeon_project\script

rem Execute Python interpreter and redirect standard output messages
rem to file log_%dt%.txt and error messages to logerr_%dt%.txt.
python.exe -u softeon_main.py >>C:\API_DOC\softeon_project\log\log_%dt%.txt 2>>C:\API_DOC\softeon_project\log\logerr_%dt%.txt

echo "After python path"
pause
Python命令行中有一个尾随空格,在上面的代码中删除了该空格。请参见和上的答案
为什么批处理文件中的尾随空格会导致意外输出到文件中,甚至导致批处理文件执行时出现意外行为

python
扩展了文件扩展名
.exe
,以避免Windows命令解释器首先找到文件
python.bat
python.cmd
,因为在这种情况下,下一行将不再执行,因为批处理文件必须通过命令从批处理文件中调用调用在执行完被调用的批处理文件后返回调用批处理文件


另请阅读Microsoft关于的文章,以了解
2>

python test.py>log.log 2>err.log
在ubuntu上对我有效的解释。也许它在windows上不起作用?我在windows上试过,它起作用了。也许您应该首先运行代码而不进行输出重定向,并检查是否显示任何错误。@Sraw:是的,它在windows 10上不起作用。我有所有正确的文件夹结构。@eiram_mahera:没有,没有重定向,它工作正常。甚至输出也被捕获。但如果出现错误,则不会出现问题。问题似乎出在日志%dt%.txt中,日期变量导致了问题。如何使用当前日期创建文件并将其作为变量传递非常感谢您的回答。非常不言自明。