-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
140 lines (105 loc) · 5.09 KB
/
main.py
File metadata and controls
140 lines (105 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import importlib.util
import os
import sys
# Definisi konstanta untuk lokasi direktori dasar
BASE_DIR = os.path.dirname(__file__)
# ---- ISOLATED_PATHS DIHAPUS ----
def load_isolated_module(module_name: str, required_deps: list = None, suffix: str = '_libs'):
"""
Memuat modul utama dan dependency kuncinya dari direktori terisolasi.
Folder isolasi secara otomatis dicari menggunakan pola:
[module_name] + [suffix] (misalnya, 'pyppeteer_libs').
"""
# 1. Tentukan jalur fisik folder library terisolasi secara dinamis
isolated_folder = f"{module_name}{suffix}" # Contoh: 'pyppeteer_libs'
isolated_path = os.path.join(BASE_DIR, 'ext_packages' ,isolated_folder)
if not os.path.isdir(isolated_path):
# Jika folder tidak ditemukan, anggap fitur ini tidak diinstal/disediakan
print(f"❌ Error: Folder library terisolasi '{isolated_folder}' tidak ditemukan di {BASE_DIR}.")
return None
# 2. Tambahkan jalur isolasi ke sys.path untuk sementara
sys.path.insert(0, isolated_path)
loaded_module = None
try:
print(f"Menggunakan jalur sementara: {isolated_path}")
# Opsional: Muat dependency yang dibutuhkan secara eksplisit terlebih dahulu
# Ini penting untuk mencegah konflik dengan library bawaan EXE
if required_deps:
print("Memuat dependency yang diperlukan...")
for dep in required_deps:
# Kita tidak perlu menyimpan hasilnya, hanya perlu memastikan modul dimuat dari jalur yang benar
importlib.import_module(dep)
# 3. Muat modul utama yang diminta
loaded_module = importlib.import_module(module_name)
print(f"✅ Modul '{module_name}' berhasil dimuat secara dinamis.")
return loaded_module
except ImportError as e:
print(f"❌ Gagal memuat modul atau dependency '{module_name}'. Pastikan semua file site-packages ada di '{isolated_folder}'. Error: {e}")
return None
except Exception as e:
print(f"❌ Kesalahan tidak terduga saat memuat modul terisolasi: {e}")
return None
finally:
# 4. Hapus jalur isolasi dari sys.path
if sys.path and sys.path[0] == isolated_path:
sys.path.pop(0)
# --- Contoh Penggunaan Dinamis ---
print("\n--- Testing Pyppeteer ---")
# Aplikasi utama tidak perlu tahu nama folder 'pyppeteer_libs',
# hanya perlu tahu modulnya 'pyppeteer'
pyppeteer_deps = ['websockets', 'pyee']
Pyppeteer = load_isolated_module('pyppeteer', pyppeteer_deps)
if Pyppeteer:
# Anda bisa langsung menggunakan Pyppeteer seolah-olah diimpor biasa
print(f"Pyppeteer version: {getattr(Pyppeteer, '__version__', 'Unknown')}")
import asyncio
# Asumsi load_isolated_module sudah didefinisikan dan berhasil dimuat
# Pyppeteer = load_isolated_module('pyppeteer', pyppeteer_deps)
# --- Fungsi Pengujian Pyppeteer ---
async def test_pyppeteer_scraping(pyppeteer_module, url):
"""
Fungsi asinkron yang menjalankan tugas dasar Pyppeteer.
"""
if not pyppeteer_module:
print("Gagal menjalankan uji coba: Modul Pyppeteer tidak dimuat.")
return
browser = None
try:
print(f"Menguji Pyppeteer: Membuka {url}...")
# 1. Meluncurkan browser (Chromium)
# Kita menggunakan objek modul yang dimuat secara terisolasi (pyppeteer_module)
browser = await pyppeteer_module.launch(headless=False, executablePath='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe')
# 2. Membuka halaman baru
page = await browser.newPage()
# 3. Menavigasi ke URL
await page.goto(url)
# 4. Mendapatkan judul halaman (uji coba dasar)
title = await page.title()
print(f"✅ Uji Coba BERHASIL! Judul halaman: '{title}'")
except Exception as e:
print(f"❌ Uji Coba GAGAL! Terjadi kesalahan saat menjalankan Pyppeteer: {e}")
finally:
# Pastikan browser ditutup
if browser:
await browser.close()
print("Browser ditutup.")
# --- Bagian Eksekusi Utama (main_app.py) ---
print("\n--- Testing Pyppeteer ---")
pyppeteer_deps = ['websockets', 'pyee']
Pyppeteer = load_isolated_module('pyppeteer', pyppeteer_deps) # Panggil fungsi pemuat Anda
if Pyppeteer:
print(f"Pyppeteer version: {getattr(Pyppeteer, '__version__', 'Unknown')}")
# Menjalankan fungsi asinkron utama dengan asyncio.run()
try:
asyncio.run(test_pyppeteer_scraping(Pyppeteer, 'https://example.com'))
except RuntimeError as e:
# Ini biasanya terjadi jika asyncio.run dipanggil dari dalam loop lain (misalnya IDE/notebook)
print(f"Gagal menjalankan asyncio.run: {e}")
# --- Testing Pyppeteer ---
# Menggunakan jalur sementara: D:\laragon\www\load_isolated_module\ext_packages\pyppeteer_libs
# Memuat dependency yang diperlukan...
# ✅ Modul 'pyppeteer' berhasil dimuat secara dinamis.
# Pyppeteer version: 2.0.0
# Menguji Pyppeteer: Membuka https://example.com...
# ✅ Uji Coba BERHASIL! Judul halaman: 'Example Domain'
# Browser ditutup.