The game was delayed for roughly 90 minutes in the 86th minute because of lightning.
The win extended the Union's unbeaten streak against D.C United to 10 games (nine wins, one draw) dating to the 2017 season. It set a team mark for longest unbeaten run against any opponent in its history.
It was Philadelphia's fourth win in a row at home.
Santos put the Union in front in the 11th minute by scoring on a breakaway after a pass from Daniel Gazdag. Santos faked D.C. United keeper Bill Hamid to the ground before lifting a left-footed shot into the center of the goal.
Joe Bendik, who was starting in goal for the first time this season for the Union, kept Philadelphia in the lead with a stirring save on Yamil Asad's shot in the 38th minute. Bendik swatted the ball with his left hand and it bounced off the crossbar before being cleared.
D.C. United produced the equalizer in the 51st minute on a penalty kick by Asad after a foul on Santos in the box against Yordy Reyna. From the spot, Asad waited for Bendik to lunge to his right before calmly finding the center of the goal.
Santos seemed to have put the Union back in front in the 70th minute but the tally was reversed by VAR when Santos was ruled to have been offside.
Przybylko produced the game-winner in the 83rd minute, taking a pass from Santos after a long break and run and uncorking a right-footed shot into the bottom left corner of the net.
The Union won despite being severely short-handed. Starting goalkeeper Andre Blake was on assignment with the Jamaica national team, several others were also on national team duty and even more players out with injuries.
Bendik and Hamid each recorded two saves.
D.C. United has three wins, a draw and two losses since it dropped a 1-0 decision at home to Philadelphia on May 23.