আমি কীভাবে একটি .py ফাইল থেকে একটি


128

কোনও কারণে, পাইপ ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন করার জন্য আমি পাইথনের "আমদানি" বিবৃতিটির উপর নির্ভর করতে পারি না

নিম্নলিখিত হিসাবে কোন ফাংশন বাস্তবায়নের কোন উপায় আছে?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

উত্তর:


241

আপনি compileallটার্মিনাল ব্যবহার করতে পারেন । নিম্নলিখিত কমান্ডটি উপ ডিরেক্টরিগুলিতে পুনরাবৃত্তভাবে যেতে হবে এবং এটি খুঁজে পাওয়া সমস্ত অজগর ফাইলের জন্য পিআইসি ফাইল তৈরি করবে। Compileall তাই আপনি এটি ব্যবহার করতে কিছু অতিরিক্ত ইনস্টল করার প্রয়োজন হবে না মডিউল, পাইথন মান গ্রন্থাগার অংশ। এটি পাইথন 2 এবং পাইথন 3 এর জন্য ঠিক একইভাবে কাজ করে।

python -m compileall .

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত - এটি আমার সমস্ত * .পিপি * * পিসিপি: পুনরাবৃত্তভাবে :) সংকলন করার প্রয়োজনে
সোদেব

1
সমস্ত লাইব্রেরি ব্যবহার করে একটি পিওয়াইসি ফাইল বিতরণ করা সম্ভব? সুতরাং ব্যবহারকারীদের এগুলি ইনস্টল করতে হবে না, কেবল পিওয়াইসি ফাইলটি চালালেন, আমি জানি জাভাতে এটি সম্ভব একটি জার ব্যবহার করে পাইথনের জন্য কোনও অনুরূপ পদ্ধতি আছে?
D.Snap

পাইথনের মেটা ফাইলগুলি সম্পর্কেও আমি কিছু শুনেছি। এই সংকলন কিছু ক্যাশে নির্মাণ? যদি না হয় তবে তার জন্য হুকুম কী ?? যেহেতু শেষ-ব্যবহারকারীদের কাছে lib ডিরেক্টরিতে লেখার অনুমতি নেই। এবং আমি এখানে জিনিসগুলি দ্রুত করতে চাই ... পিএস -Oবাইটোকোড (.pyo ফাইল আইসো। পিপিসি) সংকলনের জন্য পতাকাটিতে একবার দেখুন ।
বিপদ 89

পচে যাওয়ার কি?
সাজুউক

1
এই আদেশ সঙ্গে সাবধান। আমি compileallআমার সাইট-প্যাকেজ ফোল্ডারে দুর্ঘটনাক্রমে একটি কাজ করেছি এবং এটি সবকিছু গোলমাল করেছে
অ্যালেক্স

58

আপনি কমান্ড লাইন থেকে স্বতন্ত্র ফাইলগুলি গুলি এর সাথে সংকলন করতে পারেন:

python -m compileall <file_1>.py <file_n>.py

55

আমি যখন পাইথনটি সর্বশেষ ব্যবহার করেছি তখন কিছুক্ষণ হয়েছে, তবে আমি বিশ্বাস করি আপনি ব্যবহার করতে পারেন py_compile:

import py_compile
py_compile.compile("file.py")

8
আপনি সম্ভবত দ্বিতীয় প্যারামিটারটি অন্তর্ভুক্ত করতে চান যা আউটপুট ফাইল নির্ধারণ করে। অন্যথায়, এটি এর __pycache__/file.cpython-32.pycমতো কোনও ডিফল্ট হয় এবং আপনি তা ফেরতের মান হিসাবে পান।
rvighne

46

পাইথন স্ক্রিপ্টগুলি বাইটকোডে সংকলনের বেশ কয়েকটি উপায় খুঁজে পেয়েছি

  1. py_compileটার্মিনালে ব্যবহার :

    python -m py_compile File1.py File2.py File3.py ...

    -m সংকলনের জন্য মডিউল (গুলি) নাম নির্দিষ্ট করে।

    অথবা, ফাইলগুলির ইন্টারেক্টিভ সংকলনের জন্য

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
  2. ব্যবহার py_compile.compile:

    import py_compile
    py_compile.compile('YourFileName.py')
  3. ব্যবহার py_compile.main():

    এটি একসাথে বেশ কয়েকটি ফাইল সংকলন করে।

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])

    আপনার ইচ্ছামত তালিকাটি বাড়তে পারে। বিকল্পভাবে, আপনি স্পষ্টতই প্রধান বা এমনকি ফাইলের নামের কমান্ড লাইন টিপে ফাইলগুলির একটি তালিকা পাস করতে পারেন।

    অথবা, আপনি ['-']যদি প্রধান পাস করেন তবে এটি ইন্টারেক্টিভভাবে ফাইলগুলি সংকলন করতে পারে।

  4. ব্যবহার compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)

    এটি সরবরাহিত ডিরেক্টরিতে উপস্থিত প্রতিটি পাইথন ফাইল সংকলন করে।

  5. ব্যবহার compileall.compile_file():

    import compileall
    compileall.compile_file('YourFileName.py')

নীচের লিঙ্কগুলি একবার দেখুন:

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html


একটি ছোট সংশোধন হ'ল আপনি যে মডিউলটির নামটি লোড করছেন তা হ'ল py_compileএবং compileallনয় py_compile.pyবা compileall.py। অন্য কথায়, এটি হওয়া উচিত python3 -m py_compile PYTHON_FILENAMEবা python3 -m compileall PYTHON_FILES_DIRECTORY
ডেভি

17

আমি সংকলন ব্যবহার করব । এটি স্ক্রিপ্ট থেকে এবং কমান্ড লাইন থেকে উভয়ই দুর্দান্তভাবে কাজ করে। এটি ইতিমধ্যে উল্লিখিত py_compile এর চেয়ে কিছুটা উচ্চ স্তরের মডিউল / সরঞ্জাম যা এটি অভ্যন্তরীণভাবেও ব্যবহার করে।


compileallফাইলগুলি এড়িয়ে যাওয়ার জন্য যুক্তি অন্তর্ভুক্ত করে না যার জন্য সংশ্লিষ্ট .pycফাইলটি ইতিমধ্যে আপ টু ডেট রয়েছে, তাই না?
কাইল স্ট্র্যান্ড

2
@KyleStrand compileallফাইল ইতিমধ্যে একটি আপ-টু-ডেট আছে লাফালাফি করে .pyc(পাইথন 2.7.11 সাথে পরীক্ষিত)
eponymous

@ নামবিহীন আকর্ষণীয়। আমি অন্যথায় কেন ভেবেছি তা নিশ্চিত নয়। চেক করার জন্য ধন্যবাদ।
কাইল স্ট্র্যান্ড

6

পাইথন 2 এ আপনি ব্যবহার করতে পারেন:

python -m compileall <pythonic-project-name>

যার ফলে সব কম্পাইল .pyকরার .pycপ্রকল্পে সাবফোল্ডার অন্তর্ভুক্ত হবে।


পাইথন 3 এ আপনি ব্যবহার করতে পারেন:

python3 -m compileall <pythonic-project-name>

যার ফলে সব কম্পাইল .pyকরার __pycache__প্রকল্পে সাবফোল্ডার অন্তর্ভুক্ত ফোল্ডার নেই।

অথবা এই পোস্টটি থেকে বাদামী :

.pycপাইথন 2 এর মতো ফোল্ডারে ফাইলগুলির একই লেআউটটি প্রয়োগ করতে পারেন :

python3 -m compileall -b <pythonic-project-name>

বিকল্পটি তাদের উত্তরাধিকারের অবস্থানগুলিতে ফাইলগুলির -bআউটপুট ট্রিগার করে .pyc(অর্থাত পাইথন 2-তে একই)।


3

মূল প্রশ্নের প্রয়োজনীয়তার সাথে মিলিত করতে (উত্সের পথ এবং গন্তব্য পথ) কোডটি এমন হওয়া উচিত:

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

যদি ইনপুট কোডে ত্রুটি থাকে তবে পাই_কম্পাইল P পাইকম্পাইলআরর ব্যতিক্রম উত্থাপিত হয়।


1

এটি করার দুটি উপায় আছে

  1. কমান্ড লাইন
  2. পাইথন প্রোগ্রাম ব্যবহার করে

আপনি যদি python -m compileall <argument>পাইথন বাইনারি কোডে পাইথন কোডটি সংকলন করতে কমান্ড লাইন ব্যবহার করেন। উদা:python -m compileall -x ./*

বা, আপনি এই কোডটি আপনার লাইব্রেরি বাইট-কোডে সংকলন করতে ব্যবহার করতে পারেন।

import compileall
import os

lib_path = "your_lib_path"
build_path = "your-dest_path"

compileall.compile_dir(lib_path, force=True, legacy=True)

def compile(cu_path):
    for file in os.listdir(cu_path):
        if os.path.isdir(os.path.join(cu_path, file)):
            compile(os.path.join(cu_path, file))
        elif file.endswith(".pyc"):
            dest = os.path.join(build_path, cu_path ,file)
            os.makedirs(os.path.dirname(dest), exist_ok=True)
            os.rename(os.path.join(cu_path, file), dest)

compile(lib_path)

বিস্তারিত ডকুমেন্টেশনের জন্য s docs.python.org দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.