如何解决python用win路径子处理多个命令
我正在尝试通过 conda 触发 Python 脚本的执行。
这基本上是最简单的概念
wrap.py - 包装器意图多次执行以下脚本
import subprocess
def wrap():
while True:
cmd1=r"call C:\\Users\\my_user\\anaconda3\\Scripts\\activate.bat"
cmd2=r"cd C:\\myfolder\\mysubfolder"
cmd3=r"C:\\Users\\my_user\\anaconda3\\python.exe C:\\myfolder\\mysubfolder\\test.py"
proc = subprocess.run([cmd1,cmd2,cmd3])
if __name__ == '__main__':
wrap()
test.py - 必须执行的脚本
def mytest():
print("success")
if __name__ == '__main__':
mytest()
由于 mytest 打印成功一次,我希望包装器的输出(在 anaconda 上运行)为
(base) C:\myfolder\mysubfolder> python wrap.py
success
success
success
...
我试过
1 - subprocess.Popen
2 - 是否使用 shell=True
3 - 使用列表 ["first command","second command","third command"] 或单个字符串 "first;second;third"
4 - 使用或删除字符串前面的“r”,这里的空格破坏了游戏
5 - 使用单或双“”
6- 在 my_user 中,下划线也导致编码错误
我实际上尝试复制至少 20 个不同的 stackoverflow“解决方案”,但没有一个真正适合我。我也正确阅读了 python 文档的子处理页面,但这没有帮助。
感谢任何提示,我迷路了。
解决方法
语法 subprocess.run([cmd1,cmd2,cmd3])
表示使用 cmd1
和 cmd2
作为 cmd3
的命令行参数运行 cmd1
。相反,您想要执行单个 shell 命令序列;您在此处尝试执行的一些操作需要 shell,因此您确实需要 shell=True
,它规定使用单个字符串作为输入,而不是由命令及其参数组成的列表。
(Windows 在幕后有一些挑剔的处理,这使得使用字符串列表作为 shell=True
的第一个参数并非完全不可能;但这确实不是可移植的或显而易见的。只是不要。 )
关于此处对 shell=True
的要求,诸如 call
和 cd
(以及 Bourne 系列 shell 中的 source
或 .
)之类的命令是 shell 内置的 - ins 不作为单独的二进制文件存在;如果您没有 shell=True
,您只会得到“未找到命令”或您当地的等效信息。 (在其他情况下,您通常应该avoid shell=True
when you can. 但这不是其中一种情况;在这里,如果不进行重大代码更改,这确实是不可避免的。)
如果你的 shell 是 cmd
我猜命令可能看起来像
subprocess.run(
r"call C:\Users\my_user\anaconda3\Scripts\activate.bat & C:\Users\my_user\anaconda3\python.exe C:\myfolder\mysubfolder\test.py",shell=True)
或在字符串前没有 r
并且所有反斜杠都加倍的等效相同; r"..."
字符串和常规 "..."
字符串之间的唯一区别是前者允许您输入文字反斜杠,而后者需要您对它们进行转义;在前一种情况下,字符串中的所有内容都是文字,而在后一种情况下,您可以使用符号表示法,例如 \n
表示换行符,\t
表示制表符等.
在 Python 中,使用单引号还是双引号并不重要;您可以在它们之间自由切换,显然只要您使用相同的开始和结束引号。如果字符串中需要文字单引号,请使用双引号,这样您就不必反斜杠转义文字引号,反之亦然。还有一个三引号字符串,它接受任何一个引用字符,但允许跨越多行,即包含文字换行符而不引用它们。
如果您的首选 shell 是 sh
或 bash
,则相同的语法如下
subprocess.run(r"""
source C:\Users\my_user\anaconda3\Scripts\activate.bat &&
C:\Users\my_user\anaconda3\python.exe C:\myfolder\mysubfolder\test.py""",shell=True)
我在这两种情况下都省略了 cd
,因为您的代码中似乎没有任何内容要求子进程在特定目录中运行。如果您确实有这个要求,您可以在 cwd=r'C:\myfolder\mysubfolder'
之后添加 shell=True
以在单独的目录中运行整个子进程。
有subprocess.run()
设施不足的情况,需要下到裸露的subprocess.Popen()
,自己打理周围的水管;但这显然不是这些场景之一。如果可以,您应该远离 Popen()
,尤其是在您对子流程的理解不是很深入的情况下。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。