انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => انجمن عمومی => نویسنده: mr.amir138396 در 23 مهر 1399، 05:35 ب‌ظ

عنوان: لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 23 مهر 1399، 05:35 ب‌ظ
 
 سلام به همگی
 
 من یه مشکلی دارم اون هم اینه که چجوری یک ماژول پیتون رو در دل یکی دیگه اجرا کنم یعنی به محض اینکه مثلا عدد  1 وارد شد همونجا یک ماژول دیگه رو اجرا کنه در دل خودش یا هم اینکه حداقل یک صفحه ترمینال دیگه باز کنه اگه امکانش هست کد رو بنویسین ممنون
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: مرتضی . م در 23 مهر 1399، 05:43 ب‌ظ
من کامل متوجه منظورتون نشدم
فکر کنم جای اسکریپت و ماژول رو برعکس نوشتید
منظورتون اینه مثلا اگه کاربر ۱ رو وارد کرد بره یه برنامه دیگه رو اجرا بکنه؟
۲ تا ره به ذهنم میرسه که جفتشون هم تست کردم
اول اینکه اون برنامه ای که میخواید صدا زده بشه توی یه تابع اصلی (مثل main توی C) باشه و اول برنامه دوم بیاید اون رو import کنید و تابعش رو هرجا خواستید صدا بزنید
راه دوم اینه که اول برنامه ماژول os رو ایمپورت بکنید و برای صدازدن برنامه دوم(اگه جفتشون توی یه دایرکتوری باشند) ابن خط رو بنویسید os.system('python3 '+'NAME_OF_OTHER_SCRIPT')
من خودم با دومی حال می کنم ولی هرکدوم یه سری مزایا و معایب داره
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 23 مهر 1399، 06:16 ب‌ظ
 
 ممنون خدا خیرت بده دستت طلا فقط اگه توی یک دایرکتوری نبودن چی کار کنم در مورد راه اول هم کمی توضیح میدی ؟ به همراه مثال ممنون
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: مرتضی . م در 23 مهر 1399، 10:46 ب‌ظ
اگه توی یه دایرکتوری نبودند برای لینوکس باید ببه جای مسیر نسبی مسیر مطلق رو بدید مثلا
os.system('python3 /home/USER/Desktop/b.py')برای دومی هم مثلا برنامه اول اینه (به اسم first_program.py(
""" It is the first program that we not run it directly """
import math
def is_prime(n):
    """ Check if a numer is prime or not """
    for i in range(2, int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True
def main():
    """ The main function  """
    n=int(input('Please give me a number'))
    if is_prime(n):
        print(n, 'is prime number')
        return 0
    else:
        print(n, 'is not prime number')
        return n

و برنامه ای که خودمون صدا میزنیم اینه
""" This is the second program that we run it directly """
import math
import first_program
def prime_factors(n):
    i=2
    prime_numbers=[]
    power_of_primes=[]
    while i<=n:
        if n%i==0:
            prime_numbers.append(i)
            power_of_primes.append(0)
            while n%i==0:
                power_of_primes[-1]+=1
                n=n//i
        i+=1
    return [prime_numbers, power_of_primes]
n=first_program.main()
if n:
    [prime, power]=prime_factors(n)
    for i in range(len(prime)-1):
        print(prime[i], '^', power[i], end=' * ')
    print(prime[-1], '^', power[-1])
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 24 مهر 1399، 02:32 ب‌ظ
 
 ممنون تازه اگه به جای python3  رو gedit وارد کنی text editor باز میشه و می تونی ادیت کنی  ;D ;D ;D ;D ;D ;D ;D :)
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: مرتضی . م در 24 مهر 1399، 04:06 ب‌ظ
آره دیگه  ;)
os.system در واقع برای دستور دادن به سیستم عامل هست. حالا توی لینوکس بش هست مثلا اگه توی ویندوز بزنیم os.system('explorer.exe') میاد یه file explorer بازی میکنه
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: دانیال بهزادی در 27 مهر 1399، 04:05 ب‌ظ
سعی کنید تا جای ممکن از os استفاده نکنید، چون هم عملکرد برنامه رو پایین می‌آره و هم به سیستم‌عامل وابسته‌است.

در این حالت، باید کد دوم رو تبدیل به یک ماژول جدا یا حتا یک بستهٔ جدا کنی و توی کد نخست، درون‌ریزیش کنی.
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 28 مهر 1399، 01:05 ب‌ظ
سعی کنید تا جای ممکن از os استفاده نکنید، چون هم عملکرد برنامه رو پایین می‌آره و هم به سیستم‌عامل وابسته‌است.

در این حالت، باید کد دوم رو تبدیل به یک ماژول جدا یا حتا یک بستهٔ جدا کنی و توی کد نخست، درون‌ریزیش کنی.

 
 ممنون
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 22 آبان 1399، 02:43 ب‌ظ
آره دیگه  ;)
os.system در واقع برای دستور دادن به سیستم عامل هست. حالا توی لینوکس بش هست مثلا اگه توی ویندوز بزنیم os.system('explorer.exe') میاد یه file explorer بازی میکنه

 
 اگرچه بالا آوردن تاپیک قدیمی بده ولی  چجوری میشه که با os.system که نرم افزار باز میشه (مثلا eog در اوبونتو ) دیگه نرم افزار باز شده به ترمینال وابسته نباشه چون وقتی می زنی os.system('eog ','1.jpg') تا اون رو نبندی ترمینال کار نمیکنه
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: مرتضی . م در 22 آبان 1399، 08:03 ب‌ظ
دو تا راه فکر کنم باشه
راه اول که خودم استفاده اش نمی کنم اینه که از multithread استفاده کنید
راه دوم هم ربطی به پایتون نداره اینکه همونطور که اگه توی بش یه & بزاری ته دستور دستور توی bg اجرا میشه میتونید همین کار رو توی اون دستوری که به os میدید انجام بدید
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: mr.amir138396 در 23 آبان 1399، 11:47 ق‌ظ
دو تا راه فکر کنم باشه
راه اول که خودم استفاده اش نمی کنم اینه که از multithread استفاده کنید
راه دوم هم ربطی به پایتون نداره اینکه همونطور که اگه توی بش یه & بزاری ته دستور دستور توی bg اجرا میشه میتونید همین کار رو توی اون دستوری که به os میدید انجام بدید

 
 نفهمیدم با مثال میگید ممنون
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: مرتضی . م در 24 آبان 1399، 05:41 ق‌ظ
برای راه دوم توضیح میدم چون بحث multithread یه مقدار پیچیده است و خودم هم استفاده نکردم برای راه دوم هم توی همون مثال قبل به جای
os.system('python3 b.py')بنویسید
os.system('python3 b.py &')ولی خب اگه از درون ریزی ماژول اول در دومی استفاده میکنید فکر کنم تنها راه استفاده از multithreading باشه
عنوان: پاسخ : لینک یک ماژول پایتون به ماژولی دیگر
ارسال شده توسط: دانیال بهزادی در 28 آبان 1399، 01:51 ب‌ظ
اگرچه بالا آوردن تاپیک قدیمی بده ولی  چجوری میشه که با os.system که نرم افزار باز میشه (مثلا eog در اوبونتو ) دیگه نرم افزار باز شده به ترمینال وابسته نباشه چون وقتی می زنی os.system('eog ','1.jpg') تا اون رو نبندی ترمینال کار نمیکنه
باید از فراخوانی non-blocker استفاده کنی. این‌جا یه نمونه‌اش رو نوشتم:
https://framagit.org/tractor/carburetor/-/blob/master/carburetor#L105