انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: mr.amir138396 در 23 مهر 1399، 05:35 بظ
-
سلام به همگی
من یه مشکلی دارم اون هم اینه که چجوری یک ماژول پیتون رو در دل یکی دیگه اجرا کنم یعنی به محض اینکه مثلا عدد 1 وارد شد همونجا یک ماژول دیگه رو اجرا کنه در دل خودش یا هم اینکه حداقل یک صفحه ترمینال دیگه باز کنه اگه امکانش هست کد رو بنویسین ممنون
-
من کامل متوجه منظورتون نشدم
فکر کنم جای اسکریپت و ماژول رو برعکس نوشتید
منظورتون اینه مثلا اگه کاربر ۱ رو وارد کرد بره یه برنامه دیگه رو اجرا بکنه؟
۲ تا ره به ذهنم میرسه که جفتشون هم تست کردم
اول اینکه اون برنامه ای که میخواید صدا زده بشه توی یه تابع اصلی (مثل main توی C) باشه و اول برنامه دوم بیاید اون رو import کنید و تابعش رو هرجا خواستید صدا بزنید
راه دوم اینه که اول برنامه ماژول os رو ایمپورت بکنید و برای صدازدن برنامه دوم(اگه جفتشون توی یه دایرکتوری باشند) ابن خط رو بنویسید os.system('python3 '+'NAME_OF_OTHER_SCRIPT')
من خودم با دومی حال می کنم ولی هرکدوم یه سری مزایا و معایب داره
-
ممنون خدا خیرت بده دستت طلا فقط اگه توی یک دایرکتوری نبودن چی کار کنم در مورد راه اول هم کمی توضیح میدی ؟ به همراه مثال ممنون
-
اگه توی یه دایرکتوری نبودند برای لینوکس باید ببه جای مسیر نسبی مسیر مطلق رو بدید مثلا
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])
-
ممنون تازه اگه به جای python3 رو gedit وارد کنی text editor باز میشه و می تونی ادیت کنی ;D ;D ;D ;D ;D ;D ;D :)
-
آره دیگه ;)
os.system در واقع برای دستور دادن به سیستم عامل هست. حالا توی لینوکس بش هست مثلا اگه توی ویندوز بزنیم os.system('explorer.exe') میاد یه file explorer بازی میکنه
-
سعی کنید تا جای ممکن از os استفاده نکنید، چون هم عملکرد برنامه رو پایین میآره و هم به سیستمعامل وابستهاست.
در این حالت، باید کد دوم رو تبدیل به یک ماژول جدا یا حتا یک بستهٔ جدا کنی و توی کد نخست، درونریزیش کنی.
-
سعی کنید تا جای ممکن از os استفاده نکنید، چون هم عملکرد برنامه رو پایین میآره و هم به سیستمعامل وابستهاست.
در این حالت، باید کد دوم رو تبدیل به یک ماژول جدا یا حتا یک بستهٔ جدا کنی و توی کد نخست، درونریزیش کنی.
ممنون
-
آره دیگه ;)
os.system در واقع برای دستور دادن به سیستم عامل هست. حالا توی لینوکس بش هست مثلا اگه توی ویندوز بزنیم os.system('explorer.exe') میاد یه file explorer بازی میکنه
اگرچه بالا آوردن تاپیک قدیمی بده ولی چجوری میشه که با os.system که نرم افزار باز میشه (مثلا eog در اوبونتو ) دیگه نرم افزار باز شده به ترمینال وابسته نباشه چون وقتی می زنی os.system('eog ','1.jpg') تا اون رو نبندی ترمینال کار نمیکنه
-
دو تا راه فکر کنم باشه
راه اول که خودم استفاده اش نمی کنم اینه که از multithread استفاده کنید
راه دوم هم ربطی به پایتون نداره اینکه همونطور که اگه توی بش یه & بزاری ته دستور دستور توی bg اجرا میشه میتونید همین کار رو توی اون دستوری که به os میدید انجام بدید
-
دو تا راه فکر کنم باشه
راه اول که خودم استفاده اش نمی کنم اینه که از multithread استفاده کنید
راه دوم هم ربطی به پایتون نداره اینکه همونطور که اگه توی بش یه & بزاری ته دستور دستور توی bg اجرا میشه میتونید همین کار رو توی اون دستوری که به os میدید انجام بدید
نفهمیدم با مثال میگید ممنون
-
برای راه دوم توضیح میدم چون بحث multithread یه مقدار پیچیده است و خودم هم استفاده نکردم برای راه دوم هم توی همون مثال قبل به جای
os.system('python3 b.py')
بنویسید
os.system('python3 b.py &')
ولی خب اگه از درون ریزی ماژول اول در دومی استفاده میکنید فکر کنم تنها راه استفاده از multithreading باشه
-
اگرچه بالا آوردن تاپیک قدیمی بده ولی چجوری میشه که با os.system که نرم افزار باز میشه (مثلا eog در اوبونتو ) دیگه نرم افزار باز شده به ترمینال وابسته نباشه چون وقتی می زنی os.system('eog ','1.jpg') تا اون رو نبندی ترمینال کار نمیکنه
باید از فراخوانی non-blocker استفاده کنی. اینجا یه نمونهاش رو نوشتم:
https://framagit.org/tractor/carburetor/-/blob/master/carburetor#L105