mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	bpo-40527: Fix command line argument parsing (GH-19955)
This commit is contained in:
		
							parent
							
								
									eff870b618
								
							
						
					
					
						commit
						2668a9a5aa
					
				
					 3 changed files with 29 additions and 7 deletions
				
			
		|  | @ -756,6 +756,17 @@ def test_argv0_normalization(self): | |||
|         self.assertEqual(proc.returncode, 0, proc) | ||||
|         self.assertEqual(proc.stdout.strip(), b'0') | ||||
| 
 | ||||
|     def test_parsing_error(self): | ||||
|         args = [sys.executable, '-I', '--unknown-option'] | ||||
|         proc = subprocess.run(args, | ||||
|                               stdout=subprocess.PIPE, | ||||
|                               stderr=subprocess.PIPE, | ||||
|                               text=True) | ||||
|         err_msg = "unknown option --unknown-option\nusage: " | ||||
|         self.assertTrue(proc.stderr.startswith(err_msg), proc.stderr) | ||||
|         self.assertNotEqual(proc.returncode, 0) | ||||
| 
 | ||||
| 
 | ||||
| @unittest.skipIf(interpreter_requires_environment(), | ||||
|                  'Cannot run -I tests when PYTHON env vars are required.') | ||||
| class IgnoreEnvironmentTest(unittest.TestCase): | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fix command line argument parsing: no longer write errors multiple times | ||||
| into stderr. | ||||
|  | @ -101,7 +101,9 @@ int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) | |||
|     if (option == L'-') { | ||||
|         // Parse long option.
 | ||||
|         if (*opt_ptr == L'\0') { | ||||
|             if (_PyOS_opterr) { | ||||
|                 fprintf(stderr, "expected long option\n"); | ||||
|             } | ||||
|             return -1; | ||||
|         } | ||||
|         *longindex = 0; | ||||
|  | @ -111,7 +113,9 @@ int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) | |||
|                 break; | ||||
|         } | ||||
|         if (!opt->name) { | ||||
|             if (_PyOS_opterr) { | ||||
|                 fprintf(stderr, "unknown option %ls\n", argv[_PyOS_optind - 1]); | ||||
|             } | ||||
|             return '_'; | ||||
|         } | ||||
|         opt_ptr = L""; | ||||
|  | @ -119,8 +123,10 @@ int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) | |||
|             return opt->val; | ||||
|         } | ||||
|         if (_PyOS_optind >= argc) { | ||||
|             if (_PyOS_opterr) { | ||||
|                 fprintf(stderr, "Argument expected for the %ls options\n", | ||||
|                         argv[_PyOS_optind - 1]); | ||||
|             } | ||||
|             return '_'; | ||||
|         } | ||||
|         _PyOS_optarg = argv[_PyOS_optind++]; | ||||
|  | @ -128,14 +134,16 @@ int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) | |||
|     } | ||||
| 
 | ||||
|     if (option == 'J') { | ||||
|         if (_PyOS_opterr) | ||||
|         if (_PyOS_opterr) { | ||||
|             fprintf(stderr, "-J is reserved for Jython\n"); | ||||
|         } | ||||
|         return '_'; | ||||
|     } | ||||
| 
 | ||||
|     if ((ptr = wcschr(SHORT_OPTS, option)) == NULL) { | ||||
|         if (_PyOS_opterr) | ||||
|         if (_PyOS_opterr) { | ||||
|             fprintf(stderr, "Unknown option: -%c\n", (char)option); | ||||
|         } | ||||
|         return '_'; | ||||
|     } | ||||
| 
 | ||||
|  | @ -147,9 +155,10 @@ int _PyOS_GetOpt(Py_ssize_t argc, wchar_t * const *argv, int *longindex) | |||
| 
 | ||||
|         else { | ||||
|             if (_PyOS_optind >= argc) { | ||||
|                 if (_PyOS_opterr) | ||||
|                 if (_PyOS_opterr) { | ||||
|                     fprintf(stderr, | ||||
|                         "Argument expected for the -%c option\n", (char)option); | ||||
|                 } | ||||
|                 return '_'; | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner