diff --git a/paddle/legacy/utils/PythonUtil.cpp b/paddle/legacy/utils/PythonUtil.cpp
index 7faeff55c28b9065179ad27b3b604a9f411249e5..b7746be848404fc205c80acefb40f06376d9dea1 100644
--- a/paddle/legacy/utils/PythonUtil.cpp
+++ b/paddle/legacy/utils/PythonUtil.cpp
@@ -136,7 +136,13 @@ std::string callPythonFunc(const std::string& moduleName,
                            const std::string& funcName,
                            const std::vector<std::string>& args) {
   PyObjectPtr obj = callPythonFuncRetPyObj(moduleName, funcName, args);
+#if PY_MAJOR_VERSION >= 3
+  Py_ssize_t str_size = 0u;
+  const char* str = PyUnicode_AsUTF8AndSize(obj.get(), &str_size);
+  return std::string(str, (size_t)str_size);
+#else
   return std::string(PyString_AsString(obj.get()), PyString_Size(obj.get()));
+#endif // PY_MAJOR_VERSION >= 3
 }
 
 PyObjectPtr createPythonClass(
diff --git a/paddle/legacy/utils/PythonUtil.h b/paddle/legacy/utils/PythonUtil.h
index ca052e188bdcaaff4cb51544310d7d230f1ee998..2c0471b84c4790e1c42b7f59bb781349de2ae8ae 100644
--- a/paddle/legacy/utils/PythonUtil.h
+++ b/paddle/legacy/utils/PythonUtil.h
@@ -89,6 +89,32 @@ namespace py {
 PyObjectPtr import(const std::string& moduleName);
 
 #if PY_MAJOR_VERSION >= 3
+/**
+ * Cast a PyLong to int type T.
+ * @tparam T return type.
+ * @param [in] obj PyLong object.
+ * @param [out] ok status for casting. False if error occured. nullptr if user
+ *                 don't care is ok or not.
+ * @return The value of python object, or 0 if not ok.
+ */
+template <typename T>
+T castInt(PyObject* obj, bool* ok = nullptr) {
+  // Refer to https://www.python.org/dev/peps/pep-0237/, the int and long object
+  // were unified to long since python3
+  if (PyLong_Check(obj)) {
+    if (ok) *ok = true;
+    return (T)PyLong_AsUnsignedLong(obj);
+  } else {
+    if (ok) *ok = false;
+    return (T)0;
+  }
+}
+
+// Convert PyAPI from 2.x to 3.x
+#define PyString_FromString PyUnicode_FromString
+#define PyString_AsString PyUnicode_AsUTF8
+
+#else
 /**
  * Cast a PyLong or PyInt to int type T.
  * @tparam T return type.
@@ -99,18 +125,18 @@ PyObjectPtr import(const std::string& moduleName);
  */
 template <typename T>
 T castInt(PyObject* obj, bool* ok = nullptr) {
-  if (::PyLong_Check(obj)) {
+  if (PyLong_Check(obj)) {
     if (ok) *ok = true;
     return (T)PyLong_AsUnsignedLong(obj);
-  } else if (::PyInt_Check(obj)) {
+  } else if (PyInt_Check(obj)) {
     if (ok) *ok = true;
-    return (T)::PyInt_AsLong(obj);
+    return (T)PyInt_AsLong(obj);
   } else {
     if (ok) *ok = false;
     return (T)0;
   }
 }
-#endif // PY_MAJOR_VERSION
+#endif // PY_MAJOR_VERSION >= 3
 
 /**
  * Invoke repr of python object.
diff --git a/paddle/scripts/paddle_build.sh b/paddle/scripts/paddle_build.sh
index 89362a6f71cf8f56ee8c862da618e626047502ac..bb63497f4c9be3ecb8d38b8fe36808665844d180 100755
--- a/paddle/scripts/paddle_build.sh
+++ b/paddle/scripts/paddle_build.sh
@@ -78,6 +78,12 @@ function cmake_gen() {
             PYTHON_FLAGS="-DPYTHON_EXECUTABLE:FILEPATH=/opt/python/cp27-cp27mu/bin/python
         -DPYTHON_INCLUDE_DIR:PATH=/opt/python/cp27-cp27mu/include/python2.7
         -DPYTHON_LIBRARIES:FILEPATH=/opt/_internal/cpython-2.7.11-ucs4/lib/libpython2.7.so"
+        elif [ "$1" == "3.5" ]; then
+            export LD_LIBRARY_PATH=/opt/_internal/cpython-3.5.1/lib/
+            export PATH=/opt/_internal/cpython-3.5.1/bin/:${PATH}
+            export PYTHON_FLAGS="-DPYTHON_EXECUTABLE:FILEPATH=/opt/_internal/cpython-3.5.1/bin/python3
+            -DPYTHON_INCLUDE_DIR:PATH=/opt/_internal/cpython-3.5.1/include/python3.5m
+            -DPYTHON_LIBRARIES:FILEPATH=/opt/_internal/cpython-3.5.1/lib/libpython3.so"
         fi
     fi