diff --git a/data/extract.py b/data/extract.py
index d384f54483187232986907d3d81f1126c6cc497e..9a2a137474697add176abb225488fcbfdf589995 100644
--- a/data/extract.py
+++ b/data/extract.py
@@ -2,7 +2,7 @@ import sys
 import json
 import os
 import distutils.core
-from os.path import dirname, realpath
+from os.path import basename
 
 if sys.version_info[:2] >= (3, 3):
   from importlib.machinery import SourceFileLoader
@@ -33,10 +33,8 @@ except ImportError:
 @mock.patch.object(setuptools, 'setup')
 @mock.patch.object(distutils.core, 'setup')
 def invoke(mock1, mock2):
-  # Inserting the parent directory of the target setup.py in Python import path:
-  sys.path.append(dirname(realpath(sys.argv[-1])))
   # This is setup.py which calls setuptools.setup
-  load_source('_target_setup_', sys.argv[-1])
+  load_source('_target_setup_', basename(sys.argv[-1]))
   # called arguments are in `mock_setup.call_args`
   call_args = mock1.call_args or mock2.call_args
   args, kwargs = call_args
diff --git a/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap b/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
index c869d5aec3aa2866250fa9d8561f349325dc66ba..b6ddf4d852c4e8c03174e9c5f58126daaea985c2 100644
--- a/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/pip_setup/__snapshots__/index.spec.ts.snap
@@ -5,7 +5,7 @@ Array [
   Object {
     "cmd": "python --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -23,7 +23,7 @@ Array [
   Object {
     "cmd": "python3 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -41,7 +41,7 @@ Array [
   Object {
     "cmd": "python3.8 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -57,9 +57,9 @@ Array [
     },
   },
   Object {
-    "cmd": "<extract.py> \\"/tmp/folders/foobar.py\\"",
+    "cmd": "<extract.py> \\"folders/foobar.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo",
+      "cwd": "/tmp/github/some/repo/folders",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -338,7 +338,7 @@ Array [
   Object {
     "cmd": "python --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -356,7 +356,7 @@ Array [
   Object {
     "cmd": "python3 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -374,7 +374,7 @@ Array [
   Object {
     "cmd": "python3.8 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -392,7 +392,7 @@ Array [
   Object {
     "cmd": "<extract.py> \\"lib/manager/pip_setup/__fixtures__/setup.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo",
+      "cwd": "/tmp/github/some/repo/lib/manager/pip_setup/__fixtures__",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -415,7 +415,7 @@ Array [
   Object {
     "cmd": "python --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -433,7 +433,7 @@ Array [
   Object {
     "cmd": "python3 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -451,7 +451,7 @@ Array [
   Object {
     "cmd": "python3.8 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -469,7 +469,7 @@ Array [
   Object {
     "cmd": "<extract.py> \\"lib/manager/pip_setup/__fixtures__/setup.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo",
+      "cwd": "/tmp/github/some/repo/lib/manager/pip_setup/__fixtures__",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -492,7 +492,7 @@ Array [
   Object {
     "cmd": "python --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -510,7 +510,7 @@ Array [
   Object {
     "cmd": "python3 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -528,7 +528,7 @@ Array [
   Object {
     "cmd": "python3.8 --version",
     "options": Object {
-      "cwd": null,
+      "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
@@ -544,9 +544,9 @@ Array [
     },
   },
   Object {
-    "cmd": "<extract.py> \\"/tmp/folders/foobar.py\\"",
+    "cmd": "<extract.py> \\"folders/foobar.py\\"",
     "options": Object {
-      "cwd": "/tmp/github/some/repo",
+      "cwd": "/tmp/github/some/repo/folders",
       "encoding": "utf-8",
       "env": Object {
         "HOME": "/home/user",
diff --git a/lib/manager/pip_setup/extract.ts b/lib/manager/pip_setup/extract.ts
index 7719eee5e1157d4cd292818dd76fd196bb8ffba1..7fccd05ade7226623c63e89f9b3c1791f17517fe 100644
--- a/lib/manager/pip_setup/extract.ts
+++ b/lib/manager/pip_setup/extract.ts
@@ -6,7 +6,7 @@ import { BinarySource } from '../../util/exec/common';
 import { isSkipComment } from '../../util/ignore';
 import { ExtractConfig, PackageDependency, PackageFile } from '../common';
 import { dependencyPattern } from '../pip_requirements/extract';
-import { PythonSetup, copyExtractFile, parseReport } from './util';
+import { PythonSetup, getExtractFile, parseReport } from './util';
 
 export const pythonVersions = ['python', 'python3', 'python3.8'];
 let pythonAlias: string | null = null;
@@ -44,9 +44,8 @@ export async function extractSetupFile(
   packageFile: string,
   config: ExtractConfig
 ): Promise<PythonSetup> {
-  const cwd = config.localDir;
   let cmd = 'python';
-  const extractPy = await copyExtractFile();
+  const extractPy = await getExtractFile();
   const args = [`"${extractPy}"`, `"${packageFile}"`];
   if (config.binarySource !== BinarySource.Docker) {
     logger.debug('Running python via global command');
@@ -54,7 +53,7 @@ export async function extractSetupFile(
   }
   logger.debug({ cmd, args }, 'python command');
   const res = await exec(`${cmd} ${args.join(' ')}`, {
-    cwd,
+    cwdFile: packageFile,
     timeout: 30000,
     docker: {
       image: 'renovate/pip',
@@ -69,7 +68,7 @@ export async function extractSetupFile(
       logger.warn({ stdout: res.stdout, stderr }, 'Error in read setup file');
     }
   }
-  return parseReport();
+  return parseReport(packageFile);
 }
 
 export async function extractPackageFile(
diff --git a/lib/manager/pip_setup/index.spec.ts b/lib/manager/pip_setup/index.spec.ts
index d826bdf09180a9ce00cae4868ae7a44a94a9161e..09d58f3d5a7d9bd9ff038fd5ec83635d3d52dfd5 100644
--- a/lib/manager/pip_setup/index.spec.ts
+++ b/lib/manager/pip_setup/index.spec.ts
@@ -7,6 +7,7 @@ import {
   mockExecSequence,
 } from '../../../test/exec-util';
 import { env, getName } from '../../../test/util';
+import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as fs from '../../util/fs';
 import * as extract from './extract';
@@ -20,6 +21,7 @@ const jsonContent = readFileSync(packageFileJson, 'utf8');
 
 const config = {
   localDir: '/tmp/github/some/repo',
+  cacheDir: '/tmp/renovate/cache',
 };
 
 jest.mock('child_process');
@@ -40,11 +42,12 @@ const fixSnapshots = (snapshots: ExecSnapshots): ExecSnapshots =>
 
 describe(getName(__filename), () => {
   describe('extractPackageFile()', () => {
-    beforeEach(() => {
+    beforeEach(async () => {
       jest.resetAllMocks();
       jest.resetModules();
       extract.resetModule();
 
+      await setUtilConfig(config);
       env.getChildProcessEnv.mockReturnValue(envMock.basic);
 
       // do not copy extract.py
@@ -105,7 +108,7 @@ describe(getName(__filename), () => {
       expect(
         await extractPackageFile(
           'raise Exception()',
-          '/tmp/folders/foobar.py',
+          'folders/foobar.py',
           config
         )
       ).toBeNull();
@@ -117,7 +120,7 @@ describe(getName(__filename), () => {
       expect(
         await extractPackageFile(
           'raise Exception()',
-          '/tmp/folders/foobar.py',
+          'folders/foobar.py',
           config
         )
       ).toBeNull();
diff --git a/lib/manager/pip_setup/util.ts b/lib/manager/pip_setup/util.ts
index 40d57e4bc6b78a007cbd01a6f602efbce03da47e..dae67ed378c21d647ca10511130956d24cb41ae4 100644
--- a/lib/manager/pip_setup/util.ts
+++ b/lib/manager/pip_setup/util.ts
@@ -1,5 +1,7 @@
+import { dirname } from 'path';
+import { join } from 'upath';
 import dataFiles from '../../data-files.generated';
-import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { ensureCacheDir, outputFile, readLocalFile } from '../../util/fs';
 
 // need to match filename in `data/extract.py`
 const REPORT = 'renovate-pip_setup-report.json';
@@ -7,14 +9,16 @@ const EXTRACT = 'renovate-pip_setup-extract.py';
 
 let extractPy: string | undefined;
 
-export async function copyExtractFile(): Promise<string> {
-  if (extractPy === undefined) {
-    extractPy = dataFiles.get('extract.py');
+export async function getExtractFile(): Promise<string> {
+  if (extractPy) {
+    return extractPy;
   }
 
-  await writeLocalFile(EXTRACT, extractPy);
+  const cacheDir = await ensureCacheDir('./others/pip_setup');
+  extractPy = join(cacheDir, EXTRACT);
+  await outputFile(extractPy, dataFiles.get('extract.py'));
 
-  return EXTRACT;
+  return extractPy;
 }
 
 export interface PythonSetup {
@@ -22,7 +26,7 @@ export interface PythonSetup {
   install_requires: string[];
 }
 
-export async function parseReport(): Promise<PythonSetup> {
-  const data = await readLocalFile(REPORT, 'utf8');
+export async function parseReport(packageFile: string): Promise<PythonSetup> {
+  const data = await readLocalFile(join(dirname(packageFile), REPORT), 'utf8');
   return JSON.parse(data);
 }