Python नियम

समस्या की शिकायत करें सोर्स देखें

नियम

py_binary

नियम का सोर्स देखें
py_binary(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, exec_compatible_with, exec_properties, features, imports, legacy_create_init, licenses, main, output_licenses, python_version, restricted_to, srcs_version, stamp, tags, target_compatible_with, testonly, toolchains, visibility)

py_binary एक एक्ज़ीक्यूटेबल Python प्रोग्राम है, जिसमें .py सोर्स फ़ाइलों (शायद अन्य py_library नियमों से जुड़ा) का कलेक्शन, एक *.runfiles डायरेक्ट्री ट्री, जिसमें रन-टाइम के दौरान प्रोग्राम के लिए ज़रूरी सभी कोड और डेटा शामिल होता है. साथ ही, एक स्टब स्क्रिप्ट होती है, जो सही शुरुआती एनवायरमेंट और डेटा के साथ प्रोग्राम शुरू करती है.

उदाहरण

py_binary(
    name = "foo",
    srcs = ["foo.py"],
    data = [":transform"],  # a cc_binary which we invoke at run time
    deps = [
        ":foolib",  # a py_library
    ],
)

अगर आपको किसी दूसरी बाइनरी या टेस्ट में से py_binary चलाना है (उदाहरण के लिए, java_test में से कुछ मॉक रिसॉर्स सेट अप करने के लिए Python बाइनरी चलाना), तो दूसरी बाइनरी या टेस्ट को उसके डेटा सेक्शन में मौजूद py_binary पर निर्भर करना सही होगा. इसके बाद, दूसरी बाइनरी, सोर्स डायरेक्ट्री से py_binary का पता लगा सकती है.

py_binary(
    name = "test_main",
    srcs = ["test_main.py"],
    deps = [":testing"],
)

java_library(
    name = "testing",
    srcs = glob(["*.java"]),
    data = [":test_main"]
)

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.


अगर main नहीं बताया गया है, तो यह नाम सोर्स फ़ाइल के नाम के जैसा ही होना चाहिए जो ऐप्लिकेशन का मुख्य एंट्री पॉइंट है. इसमें एक्सटेंशन शामिल नहीं होना चाहिए. उदाहरण के लिए, अगर आपका एंट्री पॉइंट main.py कहा जाता है, तो आपका नाम main होना चाहिए.
deps

लेबल की सूची; डिफ़ॉल्ट [] है

बाइनरी टारगेट से लिंक की जाने वाली अन्य लाइब्रेरी की सूची. deps के बारे में सामान्य टिप्पणियां देखने के लिए ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं. आम तौर पर, ये py_library नियम होते हैं.
srcs

लेबल की सूची; ज़रूरी है

टारगेट बनाने के लिए प्रोसेस की गई सोर्स (.py) फ़ाइलों की सूची. इसमें आपके चेक-इन किए गए सभी कोड और जनरेट की गई सोर्स फ़ाइलें शामिल हैं. लाइब्रेरी के टारगेट इसके बजाय deps में हैं, जबकि रनटाइम के लिए ज़रूरी बाइनरी फ़ाइलें data में हैं.
imports

स्ट्रिंग की सूची; डिफ़ॉल्ट [] है

PYTHONPATH में जोड़ी जाने वाली इंपोर्ट डायरेक्ट्री की सूची.

"वैरिएबल बनाएं" विकल्प पर निर्भर करता है. इस नियम और इस पर निर्भर सभी नियमों के लिए, ये इंपोर्ट डायरेक्ट्री जोड़ी जाएंगी (ध्यान दें: यह नियम उन नियमों पर निर्भर नहीं है जिन पर यह निर्भर करता है. हर डायरेक्ट्री को PYTHONPATH में py_binary के उन नियमों के मुताबिक जोड़ दिया जाएगा जो इस नियम पर निर्भर हैं.

ऐब्सलूट पाथ (/ से शुरू होने वाले पाथ) और एक्ज़ीक्यूशन रूट के ऊपर वाले पाथ का रेफ़रंस देने वाले पाथ की अनुमति नहीं है. इससे आपको गड़बड़ी मिलेगी.

legacy_create_init

पूर्णांक; डिफ़ॉल्ट -1 है

क्या रनफ़ाइल ट्री में स्पष्ट रूप से खाली __init__.py फ़ाइलें बनानी है. इन्हें Python सोर्स कोड या शेयर की गई लाइब्रेरी वाली हर डायरेक्ट्री में बनाया जाता है. साथ ही, इन डायरेक्ट्री की हर पैरंट डायरेक्ट्री में रेपो रूट डायरेक्ट्री को छोड़कर बनाया जाता है. जब तक --incompatible_default_to_explicit_init_py का इस्तेमाल नहीं किया जाता, तब तक डिफ़ॉल्ट के तौर पर अपने-आप मैसेज का मतलब 'सही' होता है. गलत होने पर, __init__.py फ़ाइलें बनाने और ज़रूरत के हिसाब से उन्हें Python टारगेट के srcs में जोड़ने की ज़िम्मेदारी उपयोगकर्ता की होती है. हो सकता है कि यह खाली न हो.
main

लेबल; डिफ़ॉल्ट None है

सोर्स फ़ाइल का नाम, जो ऐप्लिकेशन का मुख्य एंट्री पॉइंट है. इस फ़ाइल को srcs में भी शामिल करना ज़रूरी है. अगर बताया नहीं गया है, तो name का इस्तेमाल किया जाता है (ऊपर देखें). अगर name, srcs में मौजूद किसी भी फ़ाइल नाम से मेल नहीं खाता है, तो main ज़रूर बताया जाना चाहिए.
python_version

स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट रूप से "_INTERNAL_SENTINEL" पर सेट है

Python 2 के लिए यह टारगेट (और इसके ट्रांज़िटिव deps) बनाना है या Python 3. मान्य वैल्यू, "PY2" और "PY3" (डिफ़ॉल्ट) हैं.

Python वर्शन हमेशा इस एट्रिब्यूट में दिए गए किसी भी वर्शन पर रीसेट (डिफ़ॉल्ट रूप से) हो जाता है. भले ही, इस एट्रिब्यूट के लिए तय किया गया कोई भी वर्शन हो. इस बात से कोई फ़र्क़ नहीं पड़ता कि कमांड लाइन में कौनसा वर्शन बताया गया है या इस एट्रिब्यूट पर आधारित किसी अन्य टारगेट के हिसाब से क्या वर्शन लागू होता है.

अगर आपको मौजूदा Python वर्शन पर select() करना है, तो @rules_python//python:python_version की वैल्यू की जांच करें. ज़्यादा जानकारी के लिए, यहां जाएं.

गड़बड़ी की चेतावनी: यह एट्रिब्यूट उस वर्शन को सेट करता है जिसके लिए बेज़ल आपका टारगेट बनाता है. हालांकि, #4815 की वजह से, रनटाइम के दौरान हो सकता है कि स्टब स्क्रिप्ट गलत अनुवादक वर्शन शुरू कर दे. यह तरीका देखें. इसमें, ज़रूरत के हिसाब से Python वर्शन पर ले जाने वाला py_runtime टारगेट तय करना और --python_top सेट करके इस py_runtime को चालू करना शामिल है.

srcs_version

स्ट्रिंग; डिफ़ॉल्ट तौर पर "PY2AND3" है

यह एट्रिब्यूट, टारगेट के srcs से एलान करता है कि वह Python 2, Python 3 या दोनों के साथ काम करता है. Python रनटाइम वर्शन सेट करने के लिए, एक्ज़ीक्यूटेबल Python नियम (py_binary या py_test) के python_version एट्रिब्यूट का इस्तेमाल करें.

इन वैल्यू का इस्तेमाल किया जा सकता है: "PY2AND3", "PY2", और "PY3". ऐतिहासिक वजहों से भी "PY2ONLY" और "PY3ONLY" वैल्यू की अनुमति है, लेकिन वे असल में "PY2" और "PY3" के जैसे ही हैं और ऐसा करने से बचना चाहिए.

ध्यान दें कि सिर्फ़ एक्ज़ीक्यूटेबल नियम (py_binary और py_library ) ही इस एट्रिब्यूट की वैल्यू के लिए, Python के मौजूदा वर्शन की पुष्टि करते हैं. (यह एक सुविधा है; क्योंकि py_library ने Python के मौजूदा वर्शन में बदलाव नहीं किया है. इसलिए, अगर इसने पुष्टि की है, तो PY2ONLY और PY3ONLY, दोनों लाइब्रेरी को एक ही इस्तेमाल में नहीं बनाया जा सकेगा.) इसके अलावा, अगर कोई वर्शन मेल नहीं खाता है, तो गड़बड़ी को सिर्फ़ एक्ज़ीक्यूशन के दौरान रिपोर्ट किया जाता है. खास तौर पर, यह गड़बड़ी bazel build --nobuild को शुरू करने के अनुरोध में नहीं दिखेगी.)

किन डिपेंडेंसी के लिए वर्शन की ज़रूरी शर्तें लागू होती हैं, इस बारे में गड़बड़ी की जानकारी पाने के लिए, अपने टारगेट पर find_requirements आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) को चलाएं:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
इससे, सफ़िक्स के साथ एक फ़ाइल बनेगी -pyversioninfo.txt. यह जानकारी देगी कि टारगेट को Python के किसी एक वर्शन की ज़रूरत क्यों है. ध्यान दें कि यह तब भी काम करता है, जब किसी वर्शन की समस्या की वजह से, टारगेट नहीं बनाया जा सका.

stamp

पूर्णांक; डिफ़ॉल्ट -1 है

बिल्ड की जानकारी को बाइनरी में एन्कोड करना है या नहीं. जितने तरह के प्लेसमेंट हो सकते हैं उनकी जानकारी यहां दी गई है:
  • stamp = 1: बिल्ड की जानकारी को हमेशा बाइनरी में ही स्टैंप करें, भले ही --nostamp बिल्ड में ही क्यों न हो. इस सेटिंग से बचना चाहिए, क्योंकि यह बाइनरी और इस पर निर्भर किसी भी डाउनस्ट्रीम कार्रवाई के लिए रिमोट कैश मेमोरी को खत्म कर सकती है.
  • stamp = 0: बिल्ड की जानकारी को हमेशा कॉन्सटैंट वैल्यू से बदलें. इससे बिल्ड के अच्छे नतीजों को कैश मेमोरी में सेव किया जाता है.
  • stamp = -1: बिल्ड की जानकारी को एम्बेड करने को --[no]stamp फ़्लैग से कंट्रोल किया जाता है.

स्टैंप वाली बाइनरी को तब तक फिर से नहीं बनाया जाता, जब तक उनकी डिपेंडेंसी नहीं बदलती.

py_library

नियम का सोर्स देखें
py_library(name, deps, srcs, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, imports, licenses, restricted_to, srcs_version, tags, target_compatible_with, testonly, visibility)

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

deps

लेबल की सूची; डिफ़ॉल्ट [] है

बाइनरी टारगेट से लिंक की जाने वाली अन्य लाइब्रेरी की सूची. deps के बारे में सामान्य टिप्पणियां देखने के लिए ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं. आम तौर पर, ये py_library नियम होते हैं.
srcs

लेबल की सूची; डिफ़ॉल्ट [] है

टारगेट बनाने के लिए प्रोसेस की गई सोर्स (.py) फ़ाइलों की सूची. इसमें आपके चेक-इन किए गए सभी कोड और जनरेट की गई सोर्स फ़ाइलें शामिल हैं.
imports

स्ट्रिंग की सूची; डिफ़ॉल्ट [] है

PYTHONPATH में जोड़ी जाने वाली इंपोर्ट डायरेक्ट्री की सूची.

"वैरिएबल बनाएं" विकल्प पर निर्भर करता है. इस नियम और इस पर निर्भर सभी नियमों के लिए, ये इंपोर्ट डायरेक्ट्री जोड़ी जाएंगी (ध्यान दें: यह नियम उन नियमों पर निर्भर नहीं है जिन पर यह निर्भर करता है. हर डायरेक्ट्री को PYTHONPATH में py_binary के उन नियमों के मुताबिक जोड़ दिया जाएगा जो इस नियम पर निर्भर हैं.

ऐब्सलूट पाथ (/ से शुरू होने वाले पाथ) और एक्ज़ीक्यूशन रूट के ऊपर वाले पाथ का रेफ़रंस देने वाले पाथ की अनुमति नहीं है. इससे आपको गड़बड़ी मिलेगी.

srcs_version

स्ट्रिंग; डिफ़ॉल्ट तौर पर "PY2AND3" है

यह एट्रिब्यूट, टारगेट के srcs से एलान करता है कि वह Python 2, Python 3 या दोनों के साथ काम करता है. Python रनटाइम वर्शन सेट करने के लिए, एक्ज़ीक्यूटेबल Python नियम (py_binary या py_test) के python_version एट्रिब्यूट का इस्तेमाल करें.

इन वैल्यू का इस्तेमाल किया जा सकता है: "PY2AND3", "PY2", और "PY3". ऐतिहासिक वजहों से भी "PY2ONLY" और "PY3ONLY" वैल्यू की अनुमति है, लेकिन वे असल में "PY2" और "PY3" के जैसे ही हैं और ऐसा करने से बचना चाहिए.

ध्यान दें कि सिर्फ़ एक्ज़ीक्यूटेबल नियम (py_binary और py_library ) ही इस एट्रिब्यूट की वैल्यू के लिए, Python के मौजूदा वर्शन की पुष्टि करते हैं. (यह एक सुविधा है; क्योंकि py_library ने Python के मौजूदा वर्शन में बदलाव नहीं किया है. इसलिए, अगर इसने पुष्टि की है, तो PY2ONLY और PY3ONLY, दोनों लाइब्रेरी को एक ही इस्तेमाल में नहीं बनाया जा सकेगा.) इसके अलावा, अगर कोई वर्शन मेल नहीं खाता है, तो गड़बड़ी को सिर्फ़ एक्ज़ीक्यूशन के दौरान रिपोर्ट किया जाता है. खास तौर पर, यह गड़बड़ी bazel build --nobuild को शुरू करने के अनुरोध में नहीं दिखेगी.)

किन डिपेंडेंसी के लिए वर्शन की ज़रूरी शर्तें लागू होती हैं, इस बारे में गड़बड़ी की जानकारी पाने के लिए, अपने टारगेट पर find_requirements आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) को चलाएं:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
इससे, सफ़िक्स के साथ एक फ़ाइल बनेगी -pyversioninfo.txt. यह जानकारी देगी कि टारगेट को Python के किसी एक वर्शन की ज़रूरत क्यों है. ध्यान दें कि यह तब भी काम करता है, जब किसी वर्शन की समस्या की वजह से, टारगेट नहीं बनाया जा सका.

py_test

नियम का सोर्स देखें
py_test(name, deps, srcs, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, imports, legacy_create_init, licenses, local, main, python_version, restricted_to, shard_count, size, srcs_version, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility)

py_test() नियम में टेस्ट कंपाइल किया जाता है. टेस्ट, कुछ टेस्ट कोड की जगह पर एक बाइनरी रैपर होता है.

उदाहरण

py_test(
    name = "runtest_test",
    srcs = ["runtest_test.py"],
    deps = [
        "//path/to/a/py/library",
    ],
)

एक मुख्य मॉड्यूल को भी तय किया जा सकता है:

py_test(
    name = "runtest_test",
    srcs = [
        "runtest_main.py",
        "runtest_lib.py",
    ],
    main = "runtest_main.py",
)

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

deps

लेबल की सूची; डिफ़ॉल्ट [] है

बाइनरी टारगेट से लिंक की जाने वाली अन्य लाइब्रेरी की सूची. deps के बारे में सामान्य टिप्पणियां देखने के लिए ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं. आम तौर पर, ये py_library नियम होते हैं.
srcs

लेबल की सूची; ज़रूरी है

टारगेट बनाने के लिए प्रोसेस की गई सोर्स (.py) फ़ाइलों की सूची. इसमें आपके चेक-इन किए गए सभी कोड और जनरेट की गई सोर्स फ़ाइलें शामिल हैं. लाइब्रेरी के टारगेट इसके बजाय deps में हैं, जबकि रनटाइम के लिए ज़रूरी बाइनरी फ़ाइलें data में हैं.
imports

स्ट्रिंग की सूची; डिफ़ॉल्ट [] है

PYTHONPATH में जोड़ी जाने वाली इंपोर्ट डायरेक्ट्री की सूची.

"वैरिएबल बनाएं" विकल्प पर निर्भर करता है. इस नियम और इस पर निर्भर सभी नियमों के लिए, ये इंपोर्ट डायरेक्ट्री जोड़ी जाएंगी (ध्यान दें: यह नियम उन नियमों पर निर्भर नहीं है जिन पर यह निर्भर करता है. हर डायरेक्ट्री को PYTHONPATH में py_binary के उन नियमों के मुताबिक जोड़ दिया जाएगा जो इस नियम पर निर्भर हैं.

ऐब्सलूट पाथ (/ से शुरू होने वाले पाथ) और एक्ज़ीक्यूशन रूट के ऊपर वाले पाथ का रेफ़रंस देने वाले पाथ की अनुमति नहीं है. इससे आपको गड़बड़ी मिलेगी.

legacy_create_init

पूर्णांक; डिफ़ॉल्ट -1 है

क्या रनफ़ाइल ट्री में स्पष्ट रूप से खाली __init__.py फ़ाइलें बनानी है. इन्हें Python सोर्स कोड या शेयर की गई लाइब्रेरी वाली हर डायरेक्ट्री में बनाया जाता है. साथ ही, इन डायरेक्ट्री की हर पैरंट डायरेक्ट्री में रेपो रूट डायरेक्ट्री को छोड़कर बनाया जाता है. जब तक --incompatible_default_to_explicit_init_py का इस्तेमाल नहीं किया जाता, तब तक डिफ़ॉल्ट के तौर पर अपने-आप मैसेज का मतलब 'सही' होता है. गलत होने पर, __init__.py फ़ाइलें बनाने और ज़रूरत के हिसाब से उन्हें Python टारगेट के srcs में जोड़ने की ज़िम्मेदारी उपयोगकर्ता की होती है. हो सकता है कि यह खाली न हो.
main

लेबल; डिफ़ॉल्ट None है

सोर्स फ़ाइल का नाम, जो ऐप्लिकेशन का मुख्य एंट्री पॉइंट है. इस फ़ाइल को srcs में भी शामिल करना ज़रूरी है. अगर बताया नहीं गया है, तो name का इस्तेमाल किया जाता है (ऊपर देखें). अगर name, srcs में मौजूद किसी भी फ़ाइल नाम से मेल नहीं खाता है, तो main ज़रूर बताया जाना चाहिए.
python_version

स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट रूप से "_INTERNAL_SENTINEL" पर सेट है

Python 2 के लिए यह टारगेट (और इसके ट्रांज़िटिव deps) बनाना है या Python 3. मान्य वैल्यू, "PY2" और "PY3" (डिफ़ॉल्ट) हैं.

Python वर्शन हमेशा इस एट्रिब्यूट में दिए गए किसी भी वर्शन पर रीसेट (डिफ़ॉल्ट रूप से) हो जाता है. भले ही, इस एट्रिब्यूट के लिए तय किया गया कोई भी वर्शन हो. इस बात से कोई फ़र्क़ नहीं पड़ता कि कमांड लाइन में कौनसा वर्शन बताया गया है या इस एट्रिब्यूट पर आधारित किसी अन्य टारगेट के हिसाब से क्या वर्शन लागू होता है.

अगर आपको मौजूदा Python वर्शन पर select() करना है, तो @rules_python//python:python_version की वैल्यू की जांच करें. ज़्यादा जानकारी के लिए, यहां जाएं.

गड़बड़ी की चेतावनी: यह एट्रिब्यूट उस वर्शन को सेट करता है जिसके लिए बेज़ल आपका टारगेट बनाता है. हालांकि, #4815 की वजह से, रनटाइम के दौरान हो सकता है कि स्टब स्क्रिप्ट गलत अनुवादक वर्शन शुरू कर दे. यह तरीका देखें. इसमें, ज़रूरत के हिसाब से Python वर्शन पर ले जाने वाला py_runtime टारगेट तय करना और --python_top सेट करके इस py_runtime को चालू करना शामिल है.

srcs_version

स्ट्रिंग; डिफ़ॉल्ट तौर पर "PY2AND3" है

यह एट्रिब्यूट, टारगेट के srcs से एलान करता है कि वह Python 2, Python 3 या दोनों के साथ काम करता है. Python रनटाइम वर्शन सेट करने के लिए, एक्ज़ीक्यूटेबल Python नियम (py_binary या py_test) के python_version एट्रिब्यूट का इस्तेमाल करें.

इन वैल्यू का इस्तेमाल किया जा सकता है: "PY2AND3", "PY2", और "PY3". ऐतिहासिक वजहों से भी "PY2ONLY" और "PY3ONLY" वैल्यू की अनुमति है, लेकिन वे असल में "PY2" और "PY3" के जैसे ही हैं और ऐसा करने से बचना चाहिए.

ध्यान दें कि सिर्फ़ एक्ज़ीक्यूटेबल नियम (py_binary और py_library ) ही इस एट्रिब्यूट की वैल्यू के लिए, Python के मौजूदा वर्शन की पुष्टि करते हैं. (यह एक सुविधा है; क्योंकि py_library ने Python के मौजूदा वर्शन में बदलाव नहीं किया है. इसलिए, अगर इसने पुष्टि की है, तो PY2ONLY और PY3ONLY, दोनों लाइब्रेरी को एक ही इस्तेमाल में नहीं बनाया जा सकेगा.) इसके अलावा, अगर कोई वर्शन मेल नहीं खाता है, तो गड़बड़ी को सिर्फ़ एक्ज़ीक्यूशन के दौरान रिपोर्ट किया जाता है. खास तौर पर, यह गड़बड़ी bazel build --nobuild को शुरू करने के अनुरोध में नहीं दिखेगी.)

किन डिपेंडेंसी के लिए वर्शन की ज़रूरी शर्तें लागू होती हैं, इस बारे में गड़बड़ी की जानकारी पाने के लिए, अपने टारगेट पर find_requirements आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) को चलाएं:

          bazel build <your target> \
              --aspects=@rules_python//python:defs.bzl%find_requirements \
              --output_groups=pyversioninfo
          
इससे, सफ़िक्स के साथ एक फ़ाइल बनेगी -pyversioninfo.txt. यह जानकारी देगी कि टारगेट को Python के किसी एक वर्शन की ज़रूरत क्यों है. ध्यान दें कि यह तब भी काम करता है, जब किसी वर्शन की समस्या की वजह से, टारगेट नहीं बनाया जा सका.

stamp

पूर्णांक; डिफ़ॉल्ट 0 है

py_binary() आर्ग्युमेंट का सेक्शन देखें. हालांकि, जांच के लिए स्टैंप तर्क डिफ़ॉल्ट रूप से 0 पर सेट है.

py_runtime

नियम का सोर्स देखें
py_runtime(name, bootstrap_template, compatible_with, coverage_tool, deprecation, distribs, features, files, interpreter, interpreter_path, licenses, python_version, restricted_to, stub_shebang, tags, target_compatible_with, testonly, visibility)

यह ऐसे Python रनटाइम को दिखाता है जिसका इस्तेमाल Python कोड को एक्ज़ीक्यूट करने के लिए किया जाता है.

py_runtime टारगेट, प्लैटफ़ॉर्म रनटाइम या इन-बिल्ड रनटाइम को दिखा सकता है. प्लैटफ़ॉर्म रनटाइम, किसी जाने-पहचाने पाथ पर, सिस्टम में इंस्टॉल किए गए अनुवादक को ऐक्सेस करता है. वहीं, इन-बिल्ड रनटाइम, ऐसे एक्ज़ीक्यूटेबल टारगेट पर ले जाता है जो अनुवादक के तौर पर काम करता है. दोनों मामलों में, "इंटरप्रेटर" का मतलब, ऐसी एक्ज़ीक्यूटेबल बाइनरी या रैपर स्क्रिप्ट है जो कमांड लाइन पर पास की गई Python स्क्रिप्ट को चलाने में सक्षम होती है. इन स्क्रिप्ट को स्टैंडर्ड CPython इंटरप्रेटर के तौर पर इस्तेमाल किया जाता है.

प्लैटफ़ॉर्म का रनटाइम, अपनी वजह से नॉन-हर्मेटिक होता है. यह टारगेट प्लैटफ़ॉर्म पर, एक खास पाथ पर मौजूद अनुवादक की सुविधा के लिए शर्त लागू करता है. इन-बिल्ड रनटाइम, हर्मेटिक हो सकता है या नहीं भी हो सकता है. यह इस बात पर निर्भर करता है कि वह चेक-इन किए हुए इंटरप्रेटर पर ले जाता है या किसी रैपर स्क्रिप्ट पर, जो सिस्टम इंटरप्रेटर को ऐक्सेस करता है.

उदाहरण:

py_runtime(
    name = "python-2.7.12",
    files = glob(["python-2.7.12/**"]),
    interpreter = "python-2.7.12/bin/python",
)

py_runtime(
    name = "python-3.6.0",
    interpreter_path = "/opt/pyenv/versions/3.6.0/bin/python",
)

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

bootstrap_template

लेबल; डिफ़ॉल्ट "@bazel_tools//tools/python:python_bootstrap_template.txt" है

इसे पहले "Python स्टब स्क्रिप्ट" के नाम से जाना जाता था. यह Python के हर एक्ज़ीक्यूटेबल टारगेट का एंट्रीपॉइंट है.
coverage_tool

लेबल; डिफ़ॉल्ट None है

इस टारगेट का इस्तेमाल, py_binary और py_test टारगेट से कोड कवरेज की जानकारी इकट्ठा करने के लिए किया जाता है.

अगर यह नीति सेट की जाती है, तो टारगेट से एक फ़ाइल बनाई जानी चाहिए या एक्ज़ीक्यूटेबल टारगेट होना चाहिए. अगर टारगेट एक्ज़ीक्यूटेबल है, तो किसी एक फ़ाइल का पाथ या एक्ज़ीक्यूटेबल फ़ाइल से Python कवरेज टूल का एंट्री पॉइंट तय होता है. कवरेज चालू होने पर, टारगेट और उसकी रनफ़ाइल को रनफ़ाइल में जोड़ दिया जाएगा.

टूल का एंट्री पॉइंट ऐसा होना चाहिए जिसे Python इंटरप्रेटर से लोड किया जा सके (जैसे कि .py या .pyc फ़ाइल). इसे coverage.py के कमांड लाइन आर्ग्युमेंट स्वीकार किए जाने चाहिए. इनमें कम से कम run और lcov सबकमैंड शामिल हैं.

files

लेबल की सूची; डिफ़ॉल्ट [] है

इन-बिल्ड रनटाइम के लिए, यह उन फ़ाइलों का सेट है जिनमें यह रनटाइम शामिल होता है. इन फ़ाइलों को इस रनटाइम का इस्तेमाल करने वाली Python बाइनरी की रनफ़ाइल में जोड़ दिया जाएगा. प्लैटफ़ॉर्म रनटाइम के लिए, इस एट्रिब्यूट को सेट नहीं किया जाना चाहिए.
interpreter

लेबल; डिफ़ॉल्ट None है

इन-बिल्ड रनटाइम के लिए, इस टारगेट का इस्तेमाल एक अनुवादक के तौर पर किया जाना है. प्लैटफ़ॉर्म रनटाइम के लिए, इस एट्रिब्यूट को सेट नहीं करना चाहिए.
interpreter_path

स्ट्रिंग; डिफ़ॉल्ट तौर पर "" है

प्लैटफ़ॉर्म रनटाइम के लिए, यह टारगेट प्लैटफ़ॉर्म पर Python अनुवादक का ऐब्सलूट पाथ है. इन-बिल्ड रनटाइम के लिए, इस एट्रिब्यूट को सेट नहीं करना चाहिए.
python_version

स्ट्रिंग; डिफ़ॉल्ट तौर पर "_INTERNAL_SENTINEL" है

यह रनटाइम, Python मेजर वर्शन 2 या 3 के लिए है या नहीं. मान्य वैल्यू "PY2" और "PY3" हैं.

डिफ़ॉल्ट वैल्यू को --incompatible_py3_is_default फ़्लैग से कंट्रोल किया जाता है. हालांकि, आने वाले समय में यह एट्रिब्यूट ज़रूरी होगा और इसकी कोई डिफ़ॉल्ट वैल्यू नहीं होगी.

stub_shebang

स्ट्रिंग; डिफ़ॉल्ट तौर पर "#!/usr/bin/env python3" है

"Shebas" एक्सप्रेशन को py_binary टारगेट लागू करते समय इस्तेमाल की जाने वाली बूटस्ट्रैपिंग Python स्क्रिप्ट से पहले जोड़ा गया.

ऐसा करने का बढ़ावा देने के बारे में जानने के लिए, समस्या 8685 देखें.

Windows पर लागू नहीं होता है.