The 24-year-old has signed a five-year deal with Roma paying 23.5 million euros ($26.48 million).
"It is almost impossible to say no to a club like Roma. It represents a step forward in my career and I am ready to rise to this new challenge," Lopez said in a video on the Roma website.
Lopez is Roma's fourth signing of the summer after Amadou Diawara, Bryan Cristante and Leonardo Spinazzola, taking their spending to over 100 million euros.
He began his career at Espanyol, making 78 appearances before a year-long spell on loan at Tottenham where he failed to make any appearances for the first team. He joined Betis in 2018.
Lopez's only full international appearance came as a 75th-minute substitute for Kepa Arrizabalaga in a friendly against Bosnia-Herzogovina last November. He conceded the only goal of the game three minutes after coming on.