HOUSTON (AP) -- Perhaps more important than Daniel Descalso 's homer Wednesday night was his stellar defensive play that saved the game for St. Louis.
Descalso and Allen Craig both homered to back Adam Wainwright , and the Cardinals held off the Houston Astros 4-3 after a scare in the eighth inning.
Jason Castro tied a career high with his third hit on a single with no outs. Pinch-hitter Marwin Gonzalez reached on a bunt single and first baseman Matt Adams ' throw to Descalso covering first was high. That sent Gonzalez to second as Castro tried to score, but he was thrown out at the plate by Descalso.
The second baseman had to sprint far down the right-field line to retrieve the ball before making a pinpoint throw to catcher Yadier Molina .
"I honestly didn't think they were going to send him there with no outs, but I looked up and he was (rounding) third and I just fired to home," Descalso said. "I put it right on the money and he was out."
Cardinals manager Mike Matheny raved about Descalso's effort.
"Incredible play," he said. "Turned around - pretty much a blind throw - and Yadi there for the tag. Obviously that was the game."
Gonzalez was injured on the play when he tripped over first base. He hobbled off the field and the team said he had a bruised right heel. He was replaced by pinch-runner J.A. Happ.
Jason Motte replaced Mitchell Boggs with two outs and walked Jed Lowrie , but Fernando Martinez struck out to end the inning. Motte remained in for the ninth and allowed one hit before earning his 10th save.
Descalso's homer came in a three-run first inning and Craig connected in the third to make it 4-1. Craig also had an RBI single in the first.
Wainwright (5-6) yielded seven hits and three runs with eight strikeouts in 5 2-3 innings to improve to 5-0 in six starts at Minute Maid Park.
He was disappointed that his pitch count got too high for him to get through six or seven innings.
"It's kind of a head-scratcher really because I was getting ahead pretty good tonight and I did a poor job of putting guys away early," said Wainwright, who threw 114 pitches. "A lot of people I ended up getting out, but on 2-2 and 3-2 counts."
Houston starter Bud Norris (5-3) allowed seven hits and four runs with a season-high 12 strikeouts and no walks in six innings. He became the first Astros pitcher to strike out at least 12 without a walk since Shane Reynolds in 1999.
Houston scored three in the sixth to get within one, but couldn't capitalize on opportunities in the seventh and eighth. The Astros finished with 12 hits, but left 13 runners on.
"We had a ton of chances, but we just didn't capitalize on them," Lowrie said. "We left way too many guys on base to win a game like that."
Wainwright didn't allow a hit until Castro singled with one out in the fifth. Norris and Jose Altuve hit consecutive singles to load the bases.
Wainwright ended the threat by striking out Lowrie and Fernando Martinez .
Chris Johnson tripled to center with one out in the sixth and scored on a single by Brett Wallace to get Houston within 4-1.
Castro singled with two outs before scoring on pinch-hitter Brian Bogusevic 's single, which chased Wainwright. He was replaced by Victor Marte , who allowed an RBI single by Altuve to cut the lead to 4-3.
Descalso's solo shot to right-center came with one out in the first. Carlos Beltran doubled and scored on a single by Craig to make it 2-0. A double by David Freese sent Craig home and left St. Louis up 3-0.
Molina singled to put runners at the corners, but Norris struck out Adams before Freese was tagged out in a rundown to end the inning.
Craig hit a first-pitch homer to the Crawford Boxes in left field to stretch the lead to 4-0 in the third.
Norris got back on track after that, retiring his next 11 batters and striking out seven of them.
The Astros threatened in the seventh when J.D. Martinez walked before a two-out double by Wallace. Justin Maxwell grounded into a force out to leave Houston empty-handed.
Although Wainwright didn't allow a hit until the fifth, the Astros put runners on base in the second and third thanks to errors. The error in the third came when Beltran casually jogged toward a routine fly to right by Altuve before it bounced off the heel of his glove and dropped to the ground.
That play allowed Altuve to reach second before Wainwright walked Lowrie, but the right-hander struck out Fernando Martinez to escape.
NOTES: Cardinals starter Jaime Garcia , who lasted just two innings Tuesday night, returned to St. Louis for tests to see if doctors can figure out what's wrong with him. The team isn't sure what's going on with his health, but Matheny said: "He's not right." Garcia had skipped a turn because of a sore elbow. ... Houston CF Jordan Schafer was out of the lineup for the second straight game with an illness, but came in as a pinch-runner in the ninth. ... Houston signed its third-round draft pick, RHP Brady Rodgers. ... The teams wrap up the series Thursday when Happ opposes Cardinals RHP Lance Lynn .