Sending arguments from Batch file to Python script已打开一个主题。这很好。
但是,从Python脚本返回参数值似乎存在问题。
我用两个参数调用我的Python脚本。第一个是字符串,第二个是使用字符串%project_name%
初始化的环境变量hello
。
Python脚本处理输入字符串sys.argv[1]
并从字符串中的最终\
之外提取子字符串。然后将此子字符串复制到sys.argv[2]
中,然后应该是变量%project_name%
的新值。
但是,当我首先从Windows命令行运行时,一切正常,但更新后的sys.argv[2]
不会传回%project_name%
。
请参阅命令提示符窗口中执行的以下命令:
set project_name=hello
echo "%project_name%"
"hello"
"C:\python27\python" GetProject.py "#p=/Product Delivery/Product Delivery.pj#s=Team Projects/Team Projects.pj#s=Platform Pack/Platform Pack.pj#s=GERAN SAT(A)/project.pj" %project_name%
Extracting project
project.pj
Returning project
project.pj
echo "%project_name%"
"hello"
我的Python脚本是:
import os, sys
stext = sys.argv[1]
startpos = stext.rindex("/") # get the final "/" character in the input string
rtext = stext[startpos+1:] # extracty the substring after this delimiter
print "Extracting project "
print rtext
sys.argv[2] = rtext # return this to the calling program
print "Returning project "
print sys.argv[2]
我在这里做错了什么?
答案 0 :(得分:1)
没有必要使用Python脚本从字符串中获取最后/
和字符串结尾之间或最后/
和最后一个句点之间的子字符串。这可以使用例如命令 FOR 。
演示命令处理器的此功能的示例:
批处理文件是:
@echo off
if "%~1" == "" goto :EOF
for %%I in ("%~1") do set "project_name=%%~nI"
echo Project name is: %project_name%
使用参数:
调用上面的批处理文件"#p=/Product Delivery/Product Delivery.pj#s=Team Projects/Team Projects.p j#s=Platform Pack/Platform Pack.pj#s=GERAN SAT(A)/My Project.pj"
输出结果为:
Project name is: My Project
在批处理文件中使用%%~nxI
代替%%~nI
会产生输出:
Project name is: My Project.pj
这可用作命令处理器在文件/文件夹字符串中解释/
之类的\
,以便与Unix路径兼容。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
for /?
在这两个命令的帮助输出上,解释了为文件和文件夹名称设计的特殊代码%~1
,%%~nxI
和%%~nI
。但是%%~nxI
和%%~nI
也适用于任何其他字符串,如果命令处理器不需要找出存储具有给定字符串的文件/文件夹的位置,因为至少有一个反斜杠或正斜杠,字符串中的最后一个/
或\
之后的一个句点。
好吧,批处理文件也可以是:
@echo off
if "%~1" == "" goto :EOF
set "project_name=%~n1"
echo Project name is: %project_name%
但我想回答你的问题并解释为什么你的方法根本无法发挥作用。
命令处理器cmd.exe
在运行Python之前将%project_name%
扩展为其值hello
。 Python脚本从命令处理器传递字符串hello
,而不是环境变量的名称。
字符串hello
存储在Windows从整个RAM为被调用的Python解释器分配的内存块中。此内存块中还分配了一个3指针数组,指向内存中的3个参数字符串。
我不是Python专家,但行sys.argv[2] = rtext
最有可能导致释放用于字符串hello
的内存并将字符串变量rtext
的地址分配给指针中的第三个指针数组sys.argv
。
这个字符串内存和指针管理当然对完全不同地址的RAM中命令处理器的环境表没有影响。
工作是将确定的字符串打印到设备标准输出,该设备被命令处理器重定向,并且写入设备标准输出的字符串被分配给环境变量{{ 1}}。
Python脚本project_name
是:
GetProject.py
这个Python脚本是从批处理文件调用的:
import os, sys
stext = sys.argv[1]
startpos = stext.rindex("/") # get the final "/" character in the input string
rtext = stext[startpos+1:] # extract the substring after this delimiter
print rtext # output string to device stdout
但是使用Python脚本来获取带或不带文件扩展名的项目文件的名称绝对没有必要。