diff --git a/src/libfuturize/fixes/__init__.py b/src/libfuturize/fixes/__init__.py
index 7de304d..0b56250 100644
--- a/src/libfuturize/fixes/__init__.py
+++ b/src/libfuturize/fixes/__init__.py
@@ -50,7 +50,7 @@ lib2to3_fix_names_stage2 = set([
     'lib2to3.fixes.fix_getcwdu',
     # 'lib2to3.fixes.fix_imports',   # called by libfuturize.fixes.fix_future_standard_library
     # 'lib2to3.fixes.fix_imports2',  # we don't handle this yet (dbm)
-    'lib2to3.fixes.fix_input',
+    # 'lib2to3.fixes.fix_input',     # Called conditionally by libfuturize.fixes.fix_input
     'lib2to3.fixes.fix_itertools',
     'lib2to3.fixes.fix_itertools_imports',
     'lib2to3.fixes.fix_filter',
@@ -86,6 +86,7 @@ libfuturize_fix_names_stage2 = set([
     'libfuturize.fixes.fix_future_builtins',
     'libfuturize.fixes.fix_future_standard_library',
     'libfuturize.fixes.fix_future_standard_library_urllib',
+    'libfuturize.fixes.fix_input',
     'libfuturize.fixes.fix_metaclass',
     'libpasteurize.fixes.fix_newstyle',
     'libfuturize.fixes.fix_object',
diff --git a/src/libfuturize/fixes/fix_input.py b/src/libfuturize/fixes/fix_input.py
new file mode 100644
index 0000000..8a43882
--- /dev/null
+++ b/src/libfuturize/fixes/fix_input.py
@@ -0,0 +1,32 @@
+"""
+Fixer for input.
+
+Does a check for `from builtins import input` before running the lib2to3 fixer.
+The fixer will not run when the input is already present.
+
+
+this:
+    a = input()
+becomes:
+    from builtins import input
+    a = eval(input())
+
+and this:
+    from builtins import input
+    a = input()
+becomes (no change):
+    from builtins import input
+    a = input()
+"""
+
+import lib2to3.fixes.fix_input
+from lib2to3.fixer_util import does_tree_import
+
+
+class FixInput(lib2to3.fixes.fix_input.FixInput):
+    def transform(self, node, results):
+
+        if does_tree_import('builtins', 'input', node):
+            return
+
+        return super(FixInput, self).transform(node, results)

raw_input breaking with multiple futurize passes
Let's start with a python file (test.py) containing a single line:

`test = raw_input("Test: ")`

Pass 1: Running **futurize.exe test.py --both-stages -w** converts this to:

```
from builtins import input
test = input("Input: ")
```

Pass 2: Running **futurize.exe test.py --both-stages -w** again converts this to:

```
from builtins import input
test = eval(input("Input: "))
```

The second pass is incorrect. The presence of "from builtins import input" should indicate that the bare input has already been corrected.

Note that **--both-stages** can be replaced with **--fix lib2to3.fixes.fix_input --fix lib2to3.fixes.fix_raw_input  --fix libfuturize.fixes.fix_future_builtins**. 



diff --git a/tests/test_future/test_futurize.py b/tests/test_future/test_futurize.py
index f220114..0d7c42d 100644
--- a/tests/test_future/test_futurize.py
+++ b/tests/test_future/test_futurize.py
@@ -436,6 +436,27 @@ class TestFuturizeSimple(CodeHandler):
         """
         self.convert_check(before, after, ignore_imports=False, run=False)
 
+    def test_input_without_import(self):
+        before = """
+        a = input()
+        """
+        after = """
+        from builtins import input
+        a = eval(input())
+        """
+        self.convert_check(before, after, ignore_imports=False, run=False)
+
+    def test_input_with_import(self):
+        before = """
+        from builtins import input
+        a = input()
+        """
+        after = """
+        from builtins import input
+        a = input()
+        """
+        self.convert_check(before, after, ignore_imports=False, run=False)
+
     def test_xrange(self):
         """
         The ``from builtins import range`` line was being added to the

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest unittest2
apt-get update apt-get install -y gcc
3.7
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
exceptiongroup==1.2.2
-e git+https://github.com/PythonCharmers/python-future.git@a3e303fa5d3722da43c52229fbe12085e15ac26e#egg=future
importlib-metadata==6.7.0
iniconfig==2.0.0
linecache2==1.0.0
packaging==24.0
pluggy==1.2.0
pytest==7.4.4
six==1.17.0
tomli==2.0.1
traceback2==1.4.0
typing_extensions==4.7.1
unittest2==1.1.0
zipp==3.15.0

name: python-future
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argparse==1.4.0
      - exceptiongroup==1.2.2
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - linecache2==1.0.0
      - packaging==24.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - six==1.17.0
      - tomli==2.0.1
      - traceback2==1.4.0
      - typing-extensions==4.7.1
      - unittest2==1.1.0
      - zipp==3.15.0
prefix: /opt/conda/envs/python-future

tests/test_future/test_futurize.py::TestFuturizeSimple::test_input_with_import
tests/test_future/test_futurize.py::TestLibFuturize::test_correct_exit_status tests/test_future/test_futurize.py::TestLibFuturize::test_is_encoding_comment tests/test_future/test_futurize.py::TestLibFuturize::test_is_shebang_comment tests/test_future/test_futurize.py::TestFuturizeSimple::test_UserList tests/test_future/test_futurize.py::TestFuturizeSimple::test_already_future_division tests/test_future/test_futurize.py::TestFuturizeSimple::test_apply tests/test_future/test_futurize.py::TestFuturizeSimple::test_cmp tests/test_future/test_futurize.py::TestFuturizeSimple::test_division tests/test_future/test_futurize.py::TestFuturizeSimple::test_encoding_comments_kept_at_top tests/test_future/test_futurize.py::TestFuturizeSimple::test_exception_syntax tests/test_future/test_futurize.py::TestFuturizeSimple::test_execfile tests/test_future/test_futurize.py::TestFuturizeSimple::test_import_builtins tests/test_future/test_futurize.py::TestFuturizeSimple::test_input_without_import tests/test_future/test_futurize.py::TestFuturizeSimple::test_literal_prefixes_are_not_stripped tests/test_future/test_futurize.py::TestFuturizeSimple::test_multiline_future_import tests/test_future/test_futurize.py::TestFuturizeSimple::test_oldstyle_classes tests/test_future/test_futurize.py::TestFuturizeSimple::test_oldstyle_classes_iterator tests/test_future/test_futurize.py::TestFuturizeSimple::test_raw_input tests/test_future/test_futurize.py::TestFuturizeSimple::test_shebang_blank_with_future_division_import tests/test_future/test_futurize.py::TestFuturizeSimple::test_shebang_blank_with_print_import tests/test_future/test_futurize.py::TestFuturizeSimple::test_shebang_comment tests/test_future/test_futurize.py::TestFuturizeSimple::test_shebang_docstring tests/test_future/test_futurize.py::TestFuturizeSimple::test_source_coding_utf8 tests/test_future/test_futurize.py::TestFuturizeSimple::test_super tests/test_future/test_futurize.py::TestFuturizeSimple::test_xrange tests/test_future/test_futurize.py::TestFuturizeStage1::test___future___import_position tests/test_future/test_futurize.py::TestFuturizeStage1::test_apply tests/test_future/test_futurize.py::TestFuturizeStage1::test_basestring tests/test_future/test_futurize.py::TestFuturizeStage1::test_basestring_issue_156 tests/test_future/test_futurize.py::TestFuturizeStage1::test_exceptions tests/test_future/test_futurize.py::TestFuturizeStage1::test_issue_45 tests/test_future/test_futurize.py::TestFuturizeStage1::test_long_int_literals tests/test_future/test_futurize.py::TestFuturizeStage1::test_next_1 tests/test_future/test_futurize.py::TestFuturizeStage1::test_octal_literals tests/test_future/test_futurize.py::TestFuturizeStage1::test_oldstyle_classes tests/test_future/test_futurize.py::TestFuturizeStage1::test_order_future_lines tests/test_future/test_futurize.py::TestFuturizeStage1::test_print tests/test_future/test_futurize.py::TestFuturizeStage1::test_print_already_function tests/test_future/test_futurize.py::TestFuturizeStage1::test_range_necessary_list_calls tests/test_future/test_futurize.py::TestFuturizeStage1::test_safe_division tests/test_future/test_futurize.py::TestFuturizeStage1::test_safe_division_overloaded tests/test_future/test_futurize.py::TestFuturizeStage1::test_safe_futurize_imports tests/test_future/test_futurize.py::TestFuturizeStage1::test_stdlib_modules_not_changed tests/test_future/test_futurize.py::TestFuturizeStage1::test_xrange tests/test_future/test_futurize.py::TestFuturizeAllImports::test_all_imports
src/libfuturize/fixes/__init__.py src/libfuturize/fixes/fix_input.py
src/libfuturize/fixes/__init__.py src/libfuturize/fixes/fix_input.py