KANSAS CITY, Mo. -- Billy Butler and David Lough doubled home runs in the eighth and Salvador Perez hit a two-run homer as the Kansas City Royals defeated the Houston Astros 4-2 on Friday night.
Butler's double down the third-base line scored Eric Hosmer, who started the eighth with a single, for the go-ahead run. Lough's two-out double scored Elliot Johnson, who ran for Butler.
Perez hit a two-run homer in the fourth for his first home run since April 27.
Kelvin Herrera, who was recalled Tuesday from Class AAA Omaha, worked a perfect eighth for the victory. Wesley Wright was charged with the loss, giving up the single to Hosmer, the only batter he faced.
The loss snapped the Astros' six-game road winning streak, which was their longest since 2005.
James Shields, who was acquired in a seven-player blockbuster trade in December from Tampa Bay, remains winless since April 30. In his past seven Royals starts, Shields is 0-4 with three no-decisions.
Shields left after seven innings and 111 pitches, allowing two runs on nine hits and three walks, while striking out six.
The Astros tied the score at 2-2 in the seventh when Jason Castro's two-out double scored Marwin Gonzalez.
Astros 22-year-old right-hander Jordan Lyles also went seven innings, holding the Royals to two runs on six hits while walking one and striking out three.
Greg Holland worked a flawless ninth to log his 11th save in 13 chances.
Perez homered with Hosmer aboard in the fourth to give the Royals a 2-1 lead. After Hosmer's infield single for the first Royals hit, Perez drove Lyles' next pitch out to left.
The Royals threatened to add more runs in the fourth when Billy Butler doubled to right and moved to third on Miguel Tejada's infield hit. But Chris Getz grounded out to end the inning.
The Astros seized a 1-0 lead in the third when Trevor Crowe's triple scored Brandon Barnes, who led off the inning with a single. With Crowe at third and none out, Shields struck out the next three Astros.
The Astros, who had their leadoff hitter reach base the first four innings, went 1-for-9 with runners in scoring position in those frames while stranding five runners. Gonzalez grounded into double plays to end the second and fourth innings with a runner on third base.
NOTES: Astros 2B Jose Altuve, who has an eight-game hitting streak, missed his second straight game with groin discomfort. ... Royals RHP Felipe Paulino, who had Tommy John surgery last year, will begin a minor-league rehab assignment Tuesday with Double-A Northwest Arkansas. ... Northwestern RHP Luke Farrell, the son of Boston manager John Farrell, was the Royals' sixth-round pick. ... RHP Ervin Santana, who starts Saturday, has the lowest run support in the American League. The Royals are averaging 2.68 runs per nine innings in his 11 starts.