diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index f9c14720486861a453bc5b624e145e3b160ff58d..0d542c996a5674771ebbe8c7e092531fa6aeb930 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -367,9 +367,6 @@ ProjectData::ProjectData(BaseLib::ConfigTree const& project_config,
         // Append to python's module search path
         auto py_path = py::module::import("sys").attr("path");
         py_path.attr("append")(script_directory);  // .prj or -s directory
-        // virtualenv
-        py_path.attr("append")(
-            CMakeInfoLib::CMakeInfo::python_virtualenv_sitepackages);
 
         auto const script_path =
             BaseLib::copyPathToFileName(*python_script, script_directory);
diff --git a/Applications/CLI/ogs_embedded_python.cpp b/Applications/CLI/ogs_embedded_python.cpp
index 1a16f5afb3d7efca129844d6a9f60bd610665ff7..dc7946f9d1ee7f6649fed28aad64893bd92fabe1 100644
--- a/Applications/CLI/ogs_embedded_python.cpp
+++ b/Applications/CLI/ogs_embedded_python.cpp
@@ -10,9 +10,10 @@
 
 #include "ogs_embedded_python.h"
 
-#include <algorithm>
 #include <pybind11/embed.h>
 
+#include <algorithm>
+
 #include "BaseLib/Logging.h"
 #include "ProcessLib/BoundaryConditionAndSourceTerm/Python/BHEInflowPythonBoundaryConditionModule.h"
 #include "ProcessLib/BoundaryConditionAndSourceTerm/Python/PythonBoundaryConditionModule.h"
@@ -25,6 +26,19 @@ PYBIND11_EMBEDDED_MODULE(OpenGeoSys, m)
     ProcessLib::pythonBindBoundaryCondition(m);
     ProcessLib::bheInflowpythonBindBoundaryCondition(m);
     ProcessLib::SourceTerms::Python::pythonBindSourceTerm(m);
+
+    // Check for activated virtual environment and add it to sys.path
+    pybind11::exec(R"(
+        import os
+        import sys
+        if "VIRTUAL_ENV" in os.environ:
+            venv_site_packages_path = f"{os.environ['VIRTUAL_ENV']}/lib/python{sys.version_info.major}.{sys.version_info.minor}/site-packages"
+            if os.path.exists(venv_site_packages_path):
+                print(
+                    f"Virtual environment detected, adding {venv_site_packages_path} to sys.path."
+                )
+                sys.path.insert(0, venv_site_packages_path)
+    )");
 }
 
 #ifndef OGS_BUILD_SHARED_LIBS
diff --git a/Applications/Python/CMakeLists.txt b/Applications/Python/CMakeLists.txt
index 6d0f1171608e95695f8409269bebcdceebae3b77..b15a9c06c75e03115408a2ca424629dd062a62d3 100644
--- a/Applications/Python/CMakeLists.txt
+++ b/Applications/Python/CMakeLists.txt
@@ -11,12 +11,14 @@ endif()
 add_subdirectory(ogs)
 add_subdirectory(ogs.simulator)
 add_subdirectory(ogs.mesh)
-add_subdirectory(ogs.callbacks)
+if(OGS_BUILD_WHEEL)
+    add_subdirectory(ogs.callbacks)
+endif()
 
 if(OGS_USE_PIP)
     set_target_properties(
-        simulator mesh callbacks PROPERTIES LIBRARY_OUTPUT_DIRECTORY
-                                            ${_py_build_location}
+        simulator mesh PROPERTIES LIBRARY_OUTPUT_DIRECTORY
+                                  ${_py_build_location}
     )
     file(
         COPY ogs/.
diff --git a/Applications/Python/ogs.callbacks/ogs_callbacks_module.cpp b/Applications/Python/ogs.callbacks/ogs_callbacks_module.cpp
index c2e0789138ca9a4c86713cfe4a53685c5d287158..45b1bfedbeff89c42d4f02bc4adfb1abd3923f06 100644
--- a/Applications/Python/ogs.callbacks/ogs_callbacks_module.cpp
+++ b/Applications/Python/ogs.callbacks/ogs_callbacks_module.cpp
@@ -8,9 +8,11 @@
  *
  */
 
-#include <algorithm>
+#include <pybind11/eval.h>
 #include <pybind11/pybind11.h>
 
+#include <algorithm>
+
 #include "ProcessLib/BoundaryConditionAndSourceTerm/Python/BHEInflowPythonBoundaryConditionModule.h"
 #include "ProcessLib/BoundaryConditionAndSourceTerm/Python/PythonBoundaryConditionModule.h"
 #include "ProcessLib/BoundaryConditionAndSourceTerm/Python/PythonSourceTermModule.h"
@@ -21,4 +23,12 @@ PYBIND11_MODULE(callbacks, m)
     ProcessLib::pythonBindBoundaryCondition(m);
     ProcessLib::bheInflowpythonBindBoundaryCondition(m);
     ProcessLib::SourceTerms::Python::pythonBindSourceTerm(m);
+
+    pybind11::exec(R"(
+        try:
+            import OpenGeoSys
+            raise ImportError("The Python interpreter seems to be running inside the OGS binary, but you are about to import a Python module from OGS's Python bindings. Please do not import ogs.callbacks, but use the OpenGeoSys module, instead.")
+        except ModuleNotFoundError:
+            pass
+    )");
 }
diff --git a/InfoLib/CMakeInfo.cpp.in b/InfoLib/CMakeInfo.cpp.in
index 2a600268fc131b7d8742bbfb57587344cc967658..a0b292ed959abfe66612eb07194c66ff365f02f3 100644
--- a/InfoLib/CMakeInfo.cpp.in
+++ b/InfoLib/CMakeInfo.cpp.in
@@ -17,7 +17,6 @@ namespace CMakeInfoLib
 
 namespace CMakeInfo
 {
-const std::string python_virtualenv_sitepackages("@Python_SITEARCH_NATIVE@");
 const std::string cmake_args("@CMAKE_ARGS_ESCAPED@");
 }  // namespace CMakeInfo
 }  // namespace CMakeInfoLib
diff --git a/InfoLib/CMakeInfo.h b/InfoLib/CMakeInfo.h
index db27c0236d07aa1226d49255d596c940d2f12c78..93b335821d1153f7e9c33169b7fe1caeadeb662a 100644
--- a/InfoLib/CMakeInfo.h
+++ b/InfoLib/CMakeInfo.h
@@ -21,7 +21,6 @@ namespace CMakeInfoLib
 
 namespace CMakeInfo
 {
-extern CMAKEINFOLIB_EXPORT const std::string python_virtualenv_sitepackages;
 extern CMAKEINFOLIB_EXPORT const std::string cmake_args;
 }  // namespace CMakeInfo
 }  // namespace CMakeInfoLib