Currently the operator allows to set requirement as list that needs to be hard coded.
It would be nice if airflow can support reading from file directly (something similar to how operators read sql file)
airflow/operators/python.py
raise AirflowException('PythonVirtualenvOperator only supports functions for python_callable arg')
        if (
            python_version
            and str(python_version)[0] != str(sys.version_info.major)
            and (op_args or op_kwargs)
        ):
            raise AirflowException(
                "Passing op_args or op_kwargs is not supported across different Python "
                "major versions for PythonVirtualenvOperator. Please use string_args."
            )
        if not shutil.which("virtualenv"):
            raise AirflowException('PythonVirtualenvOperator requires virtualenv, please install it.')
        super().__init__(
            python_callable=python_callable,
            op_args=op_args,
            op_kwargs=op_kwargs,
            templates_dict=templates_dict,
            templates_exts=templates_exts,
            **kwargs,
        )
        self.requirements = list(requirements or [])
        self.string_args = string_args or []
        self.python_version = python_version
        self.use_dill = use_dill
        self.system_site_packages = system_site_packages
        if not self.system_site_packages:
            if self.use_dill and 'dill' not in self.requirements:
                self.requirements.append('dill')
        self.pickling_library = dill if self.use_dill else pickle
    def execute(self, context: Context) -> Any: