我正在尝试使用一些不同的命令创建一个运行另一个python脚本的脚本。我想验证用户并搜索用户给出的歌曲。然后脚本验证spotify帐户,搜索给定的歌曲然后播放。
以下是验证Respotify的时间:
python respotify.py john doe
搜索一首歌:
search Wrecking Ball
在指定数量的搜索后播放歌曲结果将是:
play 1
我知道我可以在我的play.py文件中使用它来调用该函数:
import os
os.system = ("search Wrecking Ball")
但我希望我的“play.py”在后台运行respotify.py。我已经尝试将其置于respotify.py函数中,以便在脚本启动时可以调用一首歌。
import os
os.system = "search Wrecking Ball"
我试过但是我的脚本会忽略它。
但我认为这比那更复杂。你可以找到respotify.py here:
感谢nickie
,现在关闭解决我的问题他的回答是:
from subprocess import Popen, PIPE
p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
print >> p.stdin, "search Wrecking Ball"
output = p.communicate()[0]
但是我在控制台中遇到了这个错误:
File "respotify.py", line 338, in <module> command_loop() File "respotify.py", line 29, in command_loop command = raw_input().split(" ") EOFError: EOF when reading line
如何解决上述错误?
答案 0 :(得分:4)
os.system
和subprocess.call
都在子进程中执行程序,就像从命令行执行一样。如果我理解正确,你想执行命令:
python respotify.py john doe
并用输入提供,就像给它的stdin
一样,它将包含以下行:
search Wrecking Ball
可以使用以下代码完成此操作:
from subprocess import Popen, PIPE
p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
input = "search Wrecking Ball\n" + "play 1\n"
output = p.communicate(input)[0]
或者,如果您要提供的输入取决于子流程为您提供的输出,您可以打印到p.stdin
并从p.stdout
读取。
from subprocess import Popen, PIPE
p = Popen(["python", "respotify.py", "john", "doe"], stdin=PIPE, stdout=PIPE)
print >> p.stdin, "search Wrecking Ball"
output = p.stdout.readline()
print >> p.stdin, "play 1"
print >> p.stdin, "quit"
p.wait()
检查subprocess
模块的documentation以获取更多详细信息。
如果与子进程的通信协议很复杂,那么绝对应该使用比这更好的东西,比如@abernert建议的pexpect
库。
答案 1 :(得分:3)
尝试与CLI脚本交互 - 发送命令,等待响应和提示等等 - 这是一个痛苦的问题。像pexpect
这样的库可以让您更轻松,但它仍然不容易。
但幸运的是,你不必这样做。 respotify
显然可以用作模块而不是脚本,所以,不要尝试生成输入来提供它以便它可以解析它,依此类推,只需导入它并直接使用它。
或者,更简单地说,respotify
中的所有代码都很简单 - 至少与尝试通过CLI进行交互一样简单。所以直接使用Spotify模块。
答案 2 :(得分:2)
os.system = ("search Wrecking Ball")
不按照您的想法行事。你想要
output = os.system("search Wrecking Ball")
请注意,现代的方法是
output = subprocess.call(["search", "Wrecking", "Ball"])
答案 3 :(得分:1)
如果你可以避免它,请不要让你的Python脚本通过子进程或pexec,et.al运行其他Python脚本。这些是“来自老年人”的最后选择。
Python为我们提供了精彩礼物,只需import
另一个Python脚本作为库并直接调用它。
如果可能,import respotify
并直接调用其方法。如果没有,“库 - itize”它可以直接调用它。你的时间和理智会感谢你。