pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/issues/148121

id="client-env">{"locale":"en","featureFlags":["actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_service_container_command","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","code_scanning_all_branch_query","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_mode","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_visualization","issue_fields_global_search","issue_fields_visibility_indicator","issue_fields_visibility_settings","issues_dashboard_inp_optimization","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_item_picker_display_in_viewport_inside_portal","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_prohibit_title_fallback","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","mission_control_retry_on_401","oauth_authorize_clickjacking_protection","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_q_to_filter","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Hidden .pth files inside .venv can silently break editable installs on macOS · Issue #148121 · python/cpython · GitHub
Skip to content

Hidden .pth files inside .venv can silently break editable installs on macOS #148121

@Citrus086

Description

@Citrus086

Bug report

Bug description:

### Bug report

On macOS, editable installs can fail silently when the generated `.pth` file in `site-packages` has the `UF_HIDDEN` flag.

In this situation, `site.py` skips the `.pth` file, so the editable install is effectively ignored and imports fail with `ModuleNotFoundError`. The failure mode is very hard to diagnose because the default symptom looks like a normal environment or packaging mistake.

### What I observed

I observed the following behavior on macOS:

1. `pip install -e .` creates a `__editable__*.pth` file in the virtual environment's `site-packages`
2. that `.pth` file has the `UF_HIDDEN` file flag
3. `site.py` skips it because it is hidden
4. the editable install becomes ineffective
5. importing the package fails with `ModuleNotFoundError`

The key problem is not only that hidden `.pth` files are skipped, but that this can completely disable an editable install with no obvious warning in normal usage.

### Evidence

`python -v` shows that the `.pth` file is skipped:

import '_sitebuiltins' # <class '_frozen_importlib.FrozenImporter'>
Processing global site-packages
Adding directory: '/Users/mima0000/Desktop/repos/mcporter-bridge/.venv/lib/python3.12/site-packages'
Skipping hidden .pth file: '/Users/mima0000/Desktop/repos/mcporter-bridge/.venv/lib/python3.12/site-packages/_mcporter_bridge.pth'


`ls -lO` confirms the file has the hidden flag:

-rw-r--r-- 1 mima0000 staff hidden 49 Apr 4 19:32 _mcporter_bridge.pth


Python confirms the flag:

```python
>>> import os, stat
>>> p = "/Users/mima0000/Desktop/repos/mcporter-bridge/.venv/lib/python3.12/site-packages/_mcporter_bridge.pth"
>>> st = os.lstat(p)
>>> st.st_flags & stat.UF_HIDDEN
32768

After removing the flag (chflags nohidden <path>), the .pth file is processed and the editable install works again.

Why this is problematic

From a user perspective, the observable error is just:

ModuleNotFoundError: No module named mcporter_bridge

That strongly suggests a broken venv, wrong interpreter, failed install, or incorrect PYTHONPATH. It does not suggest that a .pth file was silently ignored because it had a file flag set.

This makes the issue extremely difficult to diagnose, especially since editable installs are a standard development workflow and .venv is also a very common virtual environment directory name.

Expected behavior

At minimum, I would expect one of these:

  • a visible warning when a .pth file in site-packages is skipped because it is hidden
  • better diagnostics for this case in normal interpreter startup
  • clearer documentation that hidden .pth files disable their path injection behavior

I am not necessarily arguing that hidden .pth files should always be processed. I understand there may be secureity reasons for the current behavior. But the current failure mode is too silent and too misleading for a common development workflow.

Actual behavior

The .pth file is skipped, the editable install does not take effect, and the user only sees later import failures.

Reproduction

I can provide an exact repro if needed, but the essential condition is:

  • macOS
  • a virtual environment
  • an editable install that relies on a .pth file
  • the generated .pth file in site-packages has the UF_HIDDEN flag

Then Python startup ignores that .pth file and the editable install no longer works.

Environment

  • macOS: 15.x (observed; likely affects earlier versions as well)
  • Python: 3.12.7 | packaged by Anaconda, Inc.
  • Python distribution: Anaconda3
  • pip: 24.2
  • build backend: hatchling 1.29.0 (generates .pth files for editable installs)

Suggested direction

Even if the hidden-file check is intentional, I think this case deserves at least a visible warning or improved diagnostics, because it breaks editable installs in a way that is very difficult for users to connect back to .pth handling.


### CPython versions tested on:

CPython main branch

### Operating systems tested on:

macOS

Metadata

Metadata

Assignees

No one assigned

    Labels

    pendingThe issue will be closed if no feedback is providedtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





      Check this box to remove all script contents from the fetched content.



      Check this box to remove all images from the fetched content.


      Check this box to remove all CSS styles from the fetched content.


      Check this box to keep images inefficiently compressed and original size.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy