我想在 Windows Batch 脚本中使用多行 python 语句。
比如我的BAT脚本是:
@echo off
echo "Executing Python Code..."
goto python_code
:python_code_back
echo "Executed Python Code!"
pause
exit()
:python_code
python -c print("""Python code running""")
goto python_code_back
python -c
对于单个语句效果很好。但是让我的python代码嵌入的是:
import random
num = input("Enter Number: ")
num = int(num)
if num%2 == 0:
print("Even")
else:
print("Odd")
exit()
如何将此Python代码嵌入到我的Windows批处理脚本中,而不调用另一个Python脚本或创建临时Python文件?
我已经经历过一些选择:
使用
python -c
和分号:我如何使用 if 之类的代码
上面的陈述?如果有办法的话,人们可能仍然想要干净的代码
多行,但我希望得到答案。
我可以运行
python
并找到一种将命令发送到解释器的方法吗?也许使用子流程?
有什么方法可以构建一个包含 python 代码的多行字符串,然后将其发送到 python 解释器或 python 命令吗?
在 bash 中我们可以使用 EOF 来保持多行干净。 BAT中有没有类似的方法?我认为不会,因为人们对此提出了许多解决方法。
'''
(三个单引号)或
"""
(三个双引号)语法?喜欢这里?
0<0# : ^
'''
@echo off
echo batch code
python %~f0 %*
exit /b 0
'''
import random
import sys
def isOdd():
print("python code")
num = input("Enter Number: ")
num = int(num)
if num%2 == 0:
print("Even")
else:
print("Odd")
def printScriptName():
print(sys.modules['__main__'].__file__)
eval(sys.argv[1] + '()')
exit()
使用示例:
call pythonEmbeddedInBatch.bat isOdd
call pythonEmbeddedInBatch.bat printScriptName
第一行将是Python中的布尔表达式,但批量重定向到空标签。其余的批处理代码将在多行 python 注释中。
0<0# : ^
'''
@echo off
set script=%~f0
python -x "%script%" %*
exit /b 0/b 0
'''
from tkinter import *
from tkinter import filedialog
import os
def browse_folder():
foldername = filedialog.askdirectory(initialdir=input_entry.get())
input_entry.delete(0, END)
input_entry.insert(0, foldername)
def convert_files():
input_path = input_entry.get()
if os.path.isdir(input_path):
# Input path is a directory, so convert all Python files in the directory
for filename in os.listdir(input_path):
if filename.endswith(".py"):
convert_single_file(os.path.join(input_path, filename))
def convert_single_file(filename):
if filename:
with open(filename, 'r') as f:
content = f.read()
# Add the batch file code at the beginning of the file
content = '0<0# : ^\n\'\'\' \n@echo off\nset script=%~f0\npython -x "%script%" %*\nexit /b 0\n\'\'\'\n' + content
# Get the base name of the original file
base_name, _ = os.path.splitext(os.path.basename(filename))
# Save the modified content as a batch file
with open(os.path.join(os.path.dirname(filename), f"{base_name}.bat"), 'w') as f:
f.write(content)
root = Tk()
root.title("Python to Batch Converter")
# Scale the GUI by a factor of 4
root.tk.call('tk', 'scaling', 4.0)
input_label = Label(root, text="Input folder:")
input_label.pack()
input_entry = Entry(root)
input_entry.pack()
browse_folder_button = Button(root, text="Browse Folder", command=browse_folder)
browse_folder_button.pack()
convert_button = Button(root, text="CONVERT", command=convert_files)
convert_button.pack()
root.mainloop()