@@ -374,7 +374,50 @@ calculate_path(void)
374
374
NSModule pythonModule ;
375
375
#endif
376
376
377
+ /* If there is no slash in the argv0 path, then we have to
378
+ * assume python is on the user's $PATH, since there's no
379
+ * other way to find a directory to start the search from. If
380
+ * $PATH isn't exported, you lose.
381
+ */
382
+ if (strchr (prog , SEP ))
383
+ strncpy (progpath , prog , MAXPATHLEN );
384
+ else if (path ) {
385
+ while (1 ) {
386
+ char * delim = strchr (path , DELIM );
387
+
388
+ if (delim ) {
389
+ size_t len = delim - path ;
390
+ if (len > MAXPATHLEN )
391
+ len = MAXPATHLEN ;
392
+ strncpy (progpath , path , len );
393
+ * (progpath + len ) = '\0' ;
394
+ }
395
+ else
396
+ strncpy (progpath , path , MAXPATHLEN );
397
+
398
+ joinpath (progpath , prog );
399
+ if (isxfile (progpath ))
400
+ break ;
401
+
402
+ if (!delim ) {
403
+ progpath [0 ] = '\0' ;
404
+ break ;
405
+ }
406
+ path = delim + 1 ;
407
+ }
408
+ }
409
+ else
410
+ progpath [0 ] = '\0' ;
411
+ if (progpath [0 ] != SEP )
412
+ absolutize (progpath );
413
+ strncpy (argv0_path , progpath , MAXPATHLEN );
414
+
377
415
#ifdef WITH_NEXT_FRAMEWORK
416
+ /* On Mac OS X we have a special case if we're running from a framework.
417
+ ** This is because the python home should be set relative to the library,
418
+ ** which is in the framework, not relative to the executable, which may
419
+ ** be outside of the framework. Except when we're in the build directory...
420
+ */
378
421
pythonModule = NSModuleForSymbol (NSLookupAndBindSymbol ("_Py_Initialize" ));
379
422
/* Use dylib functions to find out where the framework was loaded from */
380
423
buf = NSLibraryNameForModule (pythonModule );
@@ -394,60 +437,15 @@ calculate_path(void)
394
437
if (!ismodule (argv0_path )) {
395
438
/* We are in the build directory so use the name of the
396
439
executable - we know that the absolute path is passed */
397
- strncpy (progpath , prog , MAXPATHLEN );
440
+ strncpy (argv0_path , prog , MAXPATHLEN );
398
441
}
399
442
else {
400
443
/* Use the location of the library as the progpath */
401
- strncpy (progpath , buf , MAXPATHLEN );
444
+ strncpy (argv0_path , buf , MAXPATHLEN );
402
445
}
403
446
}
404
- else {
405
- /* If we're not in a framework, fall back to the old way
406
- (even though NSNameOfModule() probably does the same thing.) */
407
447
#endif
408
448
409
- /* If there is no slash in the argv0 path, then we have to
410
- * assume python is on the user's $PATH, since there's no
411
- * other way to find a directory to start the search from. If
412
- * $PATH isn't exported, you lose.
413
- */
414
- if (strchr (prog , SEP ))
415
- strncpy (progpath , prog , MAXPATHLEN );
416
- else if (path ) {
417
- while (1 ) {
418
- char * delim = strchr (path , DELIM );
419
-
420
- if (delim ) {
421
- size_t len = delim - path ;
422
- if (len > MAXPATHLEN )
423
- len = MAXPATHLEN ;
424
- strncpy (progpath , path , len );
425
- * (progpath + len ) = '\0' ;
426
- }
427
- else
428
- strncpy (progpath , path , MAXPATHLEN );
429
-
430
- joinpath (progpath , prog );
431
- if (isxfile (progpath ))
432
- break ;
433
-
434
- if (!delim ) {
435
- progpath [0 ] = '\0' ;
436
- break ;
437
- }
438
- path = delim + 1 ;
439
- }
440
- }
441
- else
442
- progpath [0 ] = '\0' ;
443
- if (progpath [0 ] != SEP )
444
- absolutize (progpath );
445
- #ifdef WITH_NEXT_FRAMEWORK
446
- }
447
- #endif
448
-
449
- strncpy (argv0_path , progpath , MAXPATHLEN );
450
-
451
449
#if HAVE_READLINK
452
450
{
453
451
char tmpbuffer [MAXPATHLEN + 1 ];
0 commit comments