ম্যাটপ্ল্লোটিব প্লটগুলি আলাদা করার কোনও উপায় আছে যাতে গণনাটি চালিয়ে যেতে পারে?


258

পাইথন ইন্টারপ্রেটারে এই নির্দেশাবলীর পরে একটি প্লটের একটি উইন্ডো পায়:

from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code

দুর্ভাগ্যক্রমে, আমি জানি না কিভাবে show()প্রোগ্রামটি আরও গণনা করার সময় তৈরি করা চিত্রটি কীভাবে ইন্টারেক্টিভভাবে চালিয়ে যেতে হবে ।

এটা কি আদৌ সম্ভব? কখনও কখনও গণনাগুলি দীর্ঘ হয় এবং মধ্যবর্তী ফলাফলগুলির পরীক্ষার সময় তারা এগিয়ে গেলে এটি সহায়তা করবে would


5
আমি নিশ্চিত করতে পারি না যে, ন্যাসক্লো থেকে 16:52-তে নির্বাচিত সমাধানটি কাজ করছে। আমার আঁকার জন্য প্লটটি প্রদর্শনের জন্য কোনও উইন্ডো খুলবে না, কেবল শেষে ব্লকিং শোটি সমাধানটি প্রদর্শন করে। তবে, 17:00 থেকে তার উত্তর সঠিক। ইন্টারেক্টিভ মোড স্যুইচিংয়ের মাধ্যমে সমস্যার ion()সমাধান হয়।
এইচ। ব্র্যান্ডস্মিয়ের

আপনি যদি উন্নত প্রোগ্রামার হন os.fork()তবে আপনি ব্যবহার করতে পারেন তবে মনে রাখতে হবে যে ব্যবহার os.fork()করা কঠিন হতে পারে কারণ আপনি পুরানো প্রক্রিয়াটি অনুলিপি করে একটি নতুন প্রক্রিয়া তৈরি করছেন।
ট্রেভর বয়েড স্মিথ

উত্তর:


214

matplotlibএর কলগুলি ব্যবহার করবে যা অবরুদ্ধ হবে না:

ব্যবহার draw():

from matplotlib.pyplot import plot, draw, show
plot([1,2,3])
draw()
print 'continue computation'

# at the end call show to ensure window won't close.
show()

ইন্টারেক্টিভ মোড ব্যবহার:

from matplotlib.pyplot import plot, ion, show
ion() # enables interactive mode
plot([1,2,3]) # result shows immediatelly (implicit draw())

print 'continue computation'

# at the end call show to ensure window won't close.
show()

28
ম্যাটপ্ল্লোলিব ০.৯৮.৩ সহ সঠিক আমদানি ম্যাটপ্ল্লোলিব.পাইপ্লট আমদানি প্লট থেকে আঁকুন, প্রদর্শন করুন
উল্কাপিছু

112
draw()আমার জন্য কাজ করে না, এটি কোনও উইন্ডো খোলে না। তবে show(block=False)পরিবর্তে এর draw()ব্যবহারটি ম্যাটপ্লোটিলেব ১.১-এ কৌশলটি মনে হচ্ছে।
রুম্পেল

4
@ ননস্ক্লো, আপনি কি দেখেছেন? আপনি এটি একটি অজগর টিউটোরিয়াল
জান

4
@ নোসকোলো আমার যদি বেশ কয়েকটি চিত্র থাকে তবে কীভাবে প্লট করবেন এবং ফিগার 1 প্রদর্শন করবেন যখন পটভূমিটি চালিয়ে যাবেন? আমি এই চিত্রটি পরবর্তী ডুমুর তৈরি হওয়ার আগে পর্যন্ত খোলা থাকতে চাই, তাই শেষে আমার সমস্ত ডুমুর খোলা থাকবে এবং কোডটি শেষ হবে। আপনার বর্তমান সমাধানের সাহায্যে এটি আমাকে ফিগার 1 বন্ধ করার অপেক্ষায় রাখে এবং তারপরে কোডটি এগিয়ে যায়। ধন্যবাদ !!
শারীরিক

9
draw()পারেন আমার জন্য কাজ না করে, শুধুমাত্র pause(0.001)যা করেছে: stackoverflow.com/questions/28269157/...
NumesSanguis

133

ব্লকিং আচরণটি ওভাররাইড করতে 'ব্লক' শব্দটি ব্যবহার করুন, যেমন

from matplotlib.pyplot import show, plot

plot(1)  
show(block=False)

# your code

আপনার কোড চালিয়ে যেতে।


17
তবে এটি অবিলম্বে প্লটের উইন্ডোটি বন্ধ করে দেবে, প্লটটি উন্মুক্ত রাখবে না।
LWZ

8
হ্যাঁ, আপনি যদি স্ক্রিপ্টটি কমান্ড লাইন থেকে কল করেন তবে এটি সত্য। আপনি যদি আইপিথন শেলটিতে থাকেন তবে উইন্ডোটি বন্ধ হবে না।
জানুয়ারী

1
সাধারণের ক্ষেত্রে উইন্ডোটি খোলা রাখবে এমন কৌশলটির জন্য @ নিকোর জবাবটি পরীক্ষা করুন।
জানুয়ারী

2
আমার জন্য, এটি তত্ক্ষণাত উইন্ডোটি বন্ধ করে না, কেবল তখনই স্ক্রিপ্টটি শেষ হয় (যাতে আপনি যদি স্ক্রিপ্টটির শেষে খোলা থাকতে চান তবে ম্যানুয়ালি ব্লক করতে পারেন)।
লুয়েটর

হ্যাঁ, স্ক্রিপ্টটি প্রস্থান করলে অ-অবরুদ্ধ উইন্ডোজগুলি বন্ধ হয়ে যাবে । আপনি হয় (ক) আপনার শেষ প্লটটি ব্লক করার অনুমতি দিতে পারেন, বা (খ) স্ক্রিপ্ট থেকে প্রস্থান করতে পারবেন না (সম্ভবত ইনপুটটি জিজ্ঞাসা করুন: "প্লট থেকে প্রস্থান করার জন্য <<<<<<<<<<<<<<<<<<<<<<<<<<<<" <<<<<<<<<<<<<<<<<< n n।>। Press press plot plot plot।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।। ")
ড্যানিয়েল গোল্ডফারব

29

আপনি যে লাইব্রেরিটি ব্যবহার করছেন তা অ-অবরুদ্ধ উপায়ে সমর্থন করে কিনা তা সর্বদা পরীক্ষা করা ভাল ।

তবে আপনি যদি আরও জেনেরিক সমাধান চান তবে বা অন্য কোনও উপায় না থাকলে multprocessingআপনি পাইথনের অন্তর্ভুক্ত মডিউলটি ব্যবহার করে একটি বিচ্ছিন্ন প্রক্রিয়াতে যে কোনও কিছুকে বাধা দেয় run গণনা চলবে:

from multiprocessing import Process
from matplotlib.pyplot import plot, show

def plot_graph(*args):
    for data in args:
        plot(data)
    show()

p = Process(target=plot_graph, args=([1, 2, 3],))
p.start()

print 'yay'
print 'computation continues...'
print 'that rocks.'

print 'Now lets wait for the graph be closed to continue...:'
p.join()

এটিতে একটি নতুন প্রক্রিয়া চালু করার ওভারহেড রয়েছে এবং কখনও কখনও জটিল পরিস্থিতিতে ডিবাগ করা আরও শক্ত হয়, তাই আমি অন্য সমাধানটি পছন্দ করবো ( matplotlibএর নন-ব্লকিং এপিআই কলগুলি ব্যবহার করে )


ধন্যবাদ! যেহেতু আমার সিস্টেমে পাইথন ২.6 এখনও নেই, তাই আমি থ্রেডিং ব্যবহার করেছি Process প্রক্রিয়াটির বিকল্প হিসাবে থ্রেড। আমি পর্যবেক্ষণ করেছি যে পরবর্তী মুদ্রণ বিবৃতিগুলি অসহনীয়ভাবে ধীরে ধীরে হয়ে যায় (তৃতীয় মুদ্রণ, আমি 1 মিনিটের অপেক্ষার পরে কী-বোর্ড ইন্টারটার্প্ট জারি করেছি)। এটি মাল্টিপ্রসেসিংয়ের পরিবর্তে থ্রেডিং ব্যবহারের একটি প্রভাব?
উল্লিখিত

@ মিটিওর: হ্যাঁ, থ্রেডিং চুষছে। আপনি সর্বদা পাইথনের জন্য মাল্টিপ্রসেসিং পেতে পারেন <2.6 এখান থেকে: পাইপ্রোসেসিং.বারলিওস.ডি
nosklo

এটি একেবারে দুর্দান্ত। আপনার কী ধারণা আছে যে ইম্যাকস (পাইথন মোড) এ প্লট উইন্ডোটি বন্ধ না হওয়া পর্যন্ত মুদ্রণ বিবৃতিগুলি কেন কার্যকর করা হয় না?
উল্লিখিত

উবুন্টু ৮.১০ (ইন্ট্রিপিড) -তে প্যাকেজটিকে (অজগর <২.6 এর জন্য) বলা হয় পাইথন-প্রসেসিং এবং আপনি এটি 'আমদানি প্রক্রিয়াকরণ' দিয়ে আমদানি করেন
উল্টো

1
আপনি কি মিস করেন নি if __name__ == '__main__':?
ওয়ার্নাইট

25

চেষ্টা

import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show(block=False)
# other code
# [...]

# Put
plt.show()
# at the very end of your script to make sure Python doesn't bail out
# before you finished examining.

show()ডকুমেন্টেশন বলেছেন:

অ-ইন্টারেক্টিভ মোডে, সমস্ত চিত্র প্রদর্শন করুন এবং চিত্রগুলি বন্ধ না হওয়া পর্যন্ত অবরুদ্ধ করুন; ইন্টারেক্টিভ মোডে এটির কোনও প্রভাব নেই যদি না অ-ইন্টারেক্টিভ থেকে ইন্টারেক্টিভ মোডে পরিবর্তনের আগে চিত্রগুলি তৈরি করা হয় (প্রস্তাবিত নয়)। সেক্ষেত্রে এটি পরিসংখ্যানগুলি প্রদর্শন করে তবে ব্লক করে না।

উপরে বর্ণিত ব্লকিং আচরণকে ওভাররাইড করতে একটি একক পরীক্ষামূলক কীওয়ার্ড আর্গুমেন্ট, ব্লক, সত্য বা মিথ্যাতে সেট করা যেতে পারে।


কেন ড্র ব্যবহার করবেন না (); [। অন্য কোড]; ()? যতদূর আমি জানি ব্লক = মিথ্যা
বোগদান

আপনি কেন মনে করেন এটি অবহেলিত? আমি এটি এখানে নথিভুক্ত দেখতে ।
নিকো Schlömer

11

গুরুত্বপূর্ণ : কিছু পরিষ্কার করার জন্য। আমি ধরে নিলাম কমান্ডগুলি একটি .pyস্ক্রিপ্টের ভিতরে রয়েছে এবং স্ক্রিপ্টকে ডায়াল করে ডাকা হয়python script.py হয় কনসোল থেকে ।

আমার পক্ষে কাজ করার একটি সহজ উপায় হ'ল:

  1. ব্লক = মিথ্যা অভ্যন্তরীণ শো ব্যবহার করুন: plt.show (ব্লক = মিথ্যা)
  2. .Py স্ক্রিপ্টের শেষে অন্য শো () ব্যবহার করুন ।

script.pyফাইলের উদাহরণ :

plt.imshow(*something*)                                                               
plt.colorbar()                                                                             
plt.xlabel("true ")                                                                   
plt.ylabel("predicted ")                                                              
plt.title(" the matrix")  

# Add block = False                                           
plt.show(block = False)

################################
# OTHER CALCULATIONS AND CODE HERE ! ! !
################################

# the next command is the last line of my script
plt.show()



8

আমার ক্ষেত্রে, আমি চেয়েছিলাম যে কয়েকটি উইন্ডোগুলি গণনা করা হচ্ছে সেগুলি পপ আপ করা উচিত। রেফারেন্সের জন্য, এই উপায়:

from matplotlib.pyplot import draw, figure, show
f1, f2 = figure(), figure()
af1 = f1.add_subplot(111)
af2 = f2.add_subplot(111)
af1.plot([1,2,3])
af2.plot([6,5,4])
draw() 
print 'continuing computation'
show()

পুনশ্চ. ম্যাটপ্ল্লোলিবের ওও ইন্টারফেসের জন্য বেশ কার্যকর গাইড


6

ঠিক আছে, অ-ব্লকিং কমান্ডগুলি সন্ধান করতে আমার খুব সমস্যা হয়েছিল ... তবে শেষ পর্যন্ত, আমি " কুকবুক / ম্যাটপ্ল্লোব / অ্যানিমেশনগুলি - নির্বাচিত প্লট উপাদানগুলি অ্যানিমেটিং " উদাহরণটি পুনরায় কাজ করতে সক্ষম হয়েছি , সুতরাং এটি থ্রেডগুলির সাথে কাজ করে ( এবং থ্রেডের মধ্যে ডেটা পাস করে) গ্লোবাল ভেরিয়েবলের মাধ্যমে বা একটি মাল্টিপ্রসেসের মাধ্যমেPipe উবুন্টু 10.04-তে পাইথন ২.6.৫ এ প্রসেসের )।

স্ক্রিপ্টটি এখানে পাওয়া যাবে: অ্যানিমেটিং_সलेक्ट করা_প্লিট_সামগ্রী - থ্রেড.পি - অন্যথায় রেফারেন্সের জন্য নীচে ( কম মন্তব্য সহ ) আটকানো হয়েছে:

import sys
import gtk, gobject
import matplotlib
matplotlib.use('GTKAgg')
import pylab as p
import numpy as nx 
import time

import threading 



ax = p.subplot(111)
canvas = ax.figure.canvas

# for profiling
tstart = time.time()

# create the initial line
x = nx.arange(0,2*nx.pi,0.01)
line, = ax.plot(x, nx.sin(x), animated=True)

# save the clean slate background -- everything but the animated line
# is drawn and saved in the pixel buffer background
background = canvas.copy_from_bbox(ax.bbox)


# just a plain global var to pass data (from main, to plot update thread)
global mypass

# http://docs.python.org/library/multiprocessing.html#pipes-and-queues
from multiprocessing import Pipe
global pipe1main, pipe1upd
pipe1main, pipe1upd = Pipe()


# the kind of processing we might want to do in a main() function,
# will now be done in a "main thread" - so it can run in
# parallel with gobject.idle_add(update_line)
def threadMainTest():
    global mypass
    global runthread
    global pipe1main

    print "tt"

    interncount = 1

    while runthread: 
        mypass += 1
        if mypass > 100: # start "speeding up" animation, only after 100 counts have passed
            interncount *= 1.03
        pipe1main.send(interncount)
        time.sleep(0.01)
    return


# main plot / GUI update
def update_line(*args):
    global mypass
    global t0
    global runthread
    global pipe1upd

    if not runthread:
        return False 

    if pipe1upd.poll(): # check first if there is anything to receive
        myinterncount = pipe1upd.recv()

    update_line.cnt = mypass

    # restore the clean slate background
    canvas.restore_region(background)
    # update the data
    line.set_ydata(nx.sin(x+(update_line.cnt+myinterncount)/10.0))
    # just draw the animated artist
    ax.draw_artist(line)
    # just redraw the axes rectangle
    canvas.blit(ax.bbox)

    if update_line.cnt>=500:
        # print the timing info and quit
        print 'FPS:' , update_line.cnt/(time.time()-tstart)

        runthread=0
        t0.join(1)   
        print "exiting"
        sys.exit(0)

    return True



global runthread

update_line.cnt = 0
mypass = 0

runthread=1

gobject.idle_add(update_line)

global t0
t0 = threading.Thread(target=threadMainTest)
t0.start() 

# start the graphics update thread
p.show()

print "out" # will never print - show() blocks indefinitely! 

আশা করি এটি কাউকে সাহায্য করবে,
চিয়ার্স!


5

চিত্রটি সংরক্ষণ করার ক্ষেত্রে অনেক ক্ষেত্রে এটি আরও সুবিধাজনকহার্ড ড্রাইভে .png ফাইল হিসাবে । এখানে কেন:

সুবিধাদি:

  • আপনি এটিকে খুলতে পারেন, এটি একবার দেখুন এবং প্রক্রিয়াটির যে কোনও সময় এটি বন্ধ করতে পারেন। আপনার অ্যাপ্লিকেশনটি দীর্ঘকাল ধরে চলার সময় এটি বিশেষত সুবিধাজনক।
  • কিছুই পপ আপ হয় না এবং আপনি উইন্ডো খোলা করতে বাধ্য হয় না। আপনি অনেক পরিসংখ্যান নিয়ে কাজ করার সময় এটি বিশেষত সুবিধাজনক।
  • আপনার চিত্রটি পরবর্তী রেফারেন্সের জন্য অ্যাক্সেসযোগ্য এবং চিত্র উইন্ডোটি বন্ধ করার সময় হারিয়ে যায় না।

অপূর্ণতা:

  • আমি কেবল ভাবতে পারি তা হ'ল আপনাকে গিয়ে ফোল্ডারটি সন্ধান করতে হবে এবং নিজেই চিত্রটি খুলতে হবে।

আপনি যদি প্রচুর চিত্র উত্পন্ন করার চেষ্টা করছেন তবে আমি আন্তরিকভাবে সম্মত।
কল্পনাপ্রসূত

6
ড্র ব্যাক পিএনজি ইন্টারেক্টিভ নয়: :
বিপরীত

5

আপনি যদি কনসোলে কাজ করছেন, অর্থাত IPythonআপনি plt.show(block=False)অন্যান্য উত্তরে নির্দেশিত হিসাবে ব্যবহার করতে পারেন । তবে আপনি যদি অলস হন তবে আপনি কেবল টাইপ করতে পারেন:

plt.show(0)

যা একই হবে।


5

আমিও যোগ করার জন্য ছিল plt.pause(0.001)সত্যিই এটিকে লুপ জন্য একটি ভিতরে কাজ (অন্যথায় এটি শুধুমাত্র প্রথম এবং শেষ চক্রান্ত দেখাতে হবে) আমার কোডে:

import matplotlib.pyplot as plt

plt.scatter([0], [1])
plt.draw()
plt.show(block=False)

for i in range(10):
    plt.scatter([i], [i+1])
    plt.draw()
    plt.pause(0.001)

এটি ম্যাকোসে matplotlib3 নিয়ে আমার জন্য কাজ করেছে। গ্রেট!
জেরি মা

4

আমার সিস্টেম শোতে () অবরুদ্ধ হয় না, যদিও আমি স্ক্রিপ্টটি ব্যবহারকারীর গ্রাফের সাথে ইন্টারঅ্যাক্ট করার জন্য অপেক্ষা করতে চেয়েছিলাম (এবং 'পিক_ইভেন্ট' কলব্যাক্স ব্যবহার করে ডেটা সংগ্রহ করে) চালিয়ে যাওয়ার আগে।

প্লটের উইন্ডোটি বন্ধ না হওয়া পর্যন্ত সম্পাদন অবরুদ্ধ করার জন্য, আমি নিম্নলিখিতগুলি ব্যবহার করেছি:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(x,y)

# set processing to continue when window closed
def onclose(event):
    fig.canvas.stop_event_loop()
fig.canvas.mpl_connect('close_event', onclose)

fig.show() # this call does not block on my system
fig.canvas.start_event_loop_default() # block here until window closed

# continue with further processing, perhaps using result from callbacks

নোট, তবে, এই ক্যানভাস.স্টার্ট_সেন্ট_লুপ_ডিফল্ট () নিম্নলিখিত সতর্কতা তৈরি করেছে:

C:\Python26\lib\site-packages\matplotlib\backend_bases.py:2051: DeprecationWarning: Using default event loop until function specific to this GUI is implemented
  warnings.warn(str,DeprecationWarning)

যদিও স্ক্রিপ্টটি এখনও চলছে।


ধন্যবাদ! স্পাইডার প্রারম্ভকালে -প্লেবগুলি আমদানি করে যা সাধারণত দরকারী, তবে এর অর্থ শো () আইওফ () যখন ব্লক হবে না - এটি আপনাকে এই আচরণটি ঠিক করতে দেয়!
হারিয়েছে

3

আমিও চেয়েছিলাম আমার প্লটগুলি বাকী কোডটি চালানোর জন্য প্রদর্শন করতে পারে (এবং তারপরে প্রদর্শন চালিয়ে যেতে পারে) এমনকি যদি কোনও ত্রুটি থাকে (আমি মাঝে মাঝে ডিবাগিংয়ের জন্য প্লট ব্যবহার করি)। আমি এই ছোট্ট হ্যাকটিকে কোড আপ করেছি যাতে এই withবিবৃতিতে থাকা কোনও প্লট এর মতো আচরণ করে।

এটি সম্ভবত কিছুটা অ-মানক এবং প্রোডাকশন কোডের জন্য উপযুক্ত নয়। এই কোডটিতে সম্ভবত অনেকগুলি গোপন "গোটচাস" রয়েছে।

from contextlib import contextmanager

@contextmanager
def keep_plots_open(keep_show_open_on_exit=True, even_when_error=True):
    '''
    To continue excecuting code when plt.show() is called
    and keep the plot on displaying before this contex manager exits
    (even if an error caused the exit).
    '''
    import matplotlib.pyplot
    show_original = matplotlib.pyplot.show
    def show_replacement(*args, **kwargs):
        kwargs['block'] = False
        show_original(*args, **kwargs)
    matplotlib.pyplot.show = show_replacement

    pylab_exists = True
    try:
        import pylab
    except ImportError: 
        pylab_exists = False
    if pylab_exists:
        pylab.show = show_replacement

    try:
        yield
    except Exception, err:
        if keep_show_open_on_exit and even_when_error:
            print "*********************************************"
            print "Error early edition while waiting for show():" 
            print "*********************************************"
            import traceback
            print traceback.format_exc()
            show_original()
            print "*********************************************"
            raise
    finally:
        matplotlib.pyplot.show = show_original
        if pylab_exists:
            pylab.show = show_original
    if keep_show_open_on_exit:
        show_original()

# ***********************
# Running example
# ***********************
import pylab as pl
import time
if __name__ == '__main__':
    with keep_plots_open():
        pl.figure('a')
        pl.plot([1,2,3], [4,5,6])     
        pl.plot([3,2,1], [4,5,6])
        pl.show()

        pl.figure('b')
        pl.plot([1,2,3], [4,5,6])
        pl.show()

        time.sleep(1)
        print '...'
        time.sleep(1)
        print '...'
        time.sleep(1)
        print '...'
        this_will_surely_cause_an_error

যদি / যখন আমি একটি যথাযথ "প্লটগুলি উন্মুক্ত রাখি (কোনও ত্রুটি দেখা দেয় তবেও) এবং নতুন প্লট দেখানোর অনুমতি দিই" প্রয়োগ করি, তবে কোনও ব্যবহারকারীর হস্তক্ষেপ অন্যথায় না বললে (ব্যাচ কার্যকর করার উদ্দেশ্যে) স্ক্রিপ্টটি সঠিকভাবে প্রস্থান করতে চাই।

আমি টাইম-আউট-প্রশ্নের মতো কিছু ব্যবহার করতে পারি "স্ক্রিপ্টের সমাপ্তি! P n আপনি যদি প্লটিং আউটপুটটি বিরতি দিতে চান (তবে আপনার 5 সেকেন্ড থাকে) টিপুন:" /programming/26704840/corner থেকে ব্যবহারকারীদের-ইনপুট-বাধা-বাস্তবায়নের জন্য-আমার-অপেক্ষার জন্য-মামলাগুলি


2
plt.figure(1)
plt.imshow(your_first_image)

plt.figure(2)
plt.imshow(your_second_image)

plt.show(block=False) # That's important 

raw_input("Press ENTER to exist") # Useful when you run your Python script from the terminal and you want to hold the running to see your figures until you press Enter

16
কীভাবে একটি প্রেস বিদ্যমান থাকার আগে প্রবেশ করবে?
গ্রাভিনা

2

ওপি matplotlibপ্লটগুলি পৃথকীকরণের বিষয়ে জিজ্ঞাসা করে । বেশিরভাগ উত্তর একটি অজগর দোভাষী দ্বারা কমান্ড কার্যকর করা অনুমান করে। এখানে উপস্থাপিত ইউজ-কেসটি এমন একটি টার্মিনাল (যেমন বাশ) এর টেস্টিং কোডের জন্য আমার পছন্দ, যেখানে file.pyআপনি চালিত হন এবং আপনি প্লট (গুলি) আসতে চান তবে পাইথন স্ক্রিপ্টটি সম্পূর্ণ হয়ে কমান্ড প্রম্পটে ফিরে আসে return

এই একা ফাইলটি multiprocessingডেটা প্লট করার জন্য একটি পৃথক প্রক্রিয়া চালু করতে ব্যবহার করে matplotlib। মূল থ্রেড এই পোস্টে os._exit(1)উল্লিখিত ব্যবহার করে প্রস্থান করে । প্রস্থান কিন্তু পাতার প্রধান বাহিনী শিশু প্রক্রিয়া জীবিত এবং প্রতিক্রিয়াশীল পর্যন্ত চক্রান্ত উইন্ডো বন্ধ করা হয়। এটি সম্পূর্ণ পৃথক প্রক্রিয়া।os._exit()matplotlib

এই পদ্ধতির মত কিছুটা মতলব বিকাশ সেশনের মতো ফিগার উইন্ডো যা প্রতিক্রিয়াশীল কমান্ড প্রম্পট নিয়ে আসে। এই পদ্ধতির সাথে, আপনি চিত্র উইন্ডো প্রক্রিয়াটির সাথে সমস্ত যোগাযোগ হারিয়ে ফেলেছেন, তবে, এটি উন্নয়ন এবং ডিবাগিংয়ের জন্য ঠিক। কেবল উইন্ডোটি বন্ধ করুন এবং পরীক্ষা চালিয়ে যান।

multiprocessingপাইথন-কেবল কোড এক্সিকিউশনের জন্য ডিজাইন করা হয়েছে যা এটি এর চেয়ে সম্ভবত আরও উপযুক্ত subprocessmultiprocessingক্রস প্ল্যাটফর্ম তাই এটি উইন্ডোজ বা ম্যাকের সামান্য বা কোনও সামঞ্জস্যের সাথে ভালভাবে কাজ করা উচিত। অন্তর্নিহিত অপারেটিং সিস্টেমটি পরীক্ষা করার দরকার নেই। এটি লিনাক্স, উবুন্টু 18.04LTS এ পরীক্ষা করা হয়েছিল।

#!/usr/bin/python3

import time
import multiprocessing
import os

def plot_graph(data):
    from matplotlib.pyplot import plot, draw, show
    print("entered plot_graph()")
    plot(data)
    show() # this will block and remain a viable process as long as the figure window is open
    print("exiting plot_graph() process")

if __name__ == "__main__":
    print("starting __main__")
    multiprocessing.Process(target=plot_graph, args=([1, 2, 3],)).start()
    time.sleep(5)
    print("exiting main")
    os._exit(0) # this exits immediately with no cleanup or buffer flushing

রানিং file.pyএকটি চিত্র উইন্ডো নিয়ে আসে, তারপরে __main__প্রস্থান করে তবে multiprocessing+ matplotlibচিত্র উইন্ডোটি জুম, প্যান এবং অন্যান্য বোতামগুলির সাথে প্রতিক্রিয়াশীল থাকে কারণ এটি একটি স্বতন্ত্র প্রক্রিয়া।

এর সাথে ব্যাশ কমান্ড প্রম্পটে প্রক্রিয়াগুলি পরীক্ষা করুন:

ps ax|grep -v grep |grep file.py


আমি আপনার সমাধানটি ব্যবহার করার চেষ্টা করছিলাম তবে এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে এবং কেন তা আমি বের করার চেষ্টা করছি। আমি কোডটি টার্মিনালের মাধ্যমে চালাচ্ছি না তবে পাইচার্ম আইডিই থেকে যদি কোনও পার্থক্য আসে তবে তা করা উচিত নয়।
ttsesm

1
ঠিক আছে, অবশেষে আমার জন্য যা কাজ করেছিল তা .daemon=Falseএখানে বর্ণিত শিশু প্রক্রিয়াটি সেট করা ছিল স্ট্যাকওভারফ্লো.com/a/49607287/1476932 যাইহোক, sys.exit()আমি সন্তানের উইন্ডোটি বন্ধ না করা পর্যন্ত সেখানে বর্ণিত পিতামাতার প্রক্রিয়াটি বাতিল করেনি। অন্যদিকে os._exit(0)উপরের উদাহরণটি ব্যবহার করে কাজ হয়েছে।
ttsesm

1

আমার মতে, এই থ্রেডের উত্তরগুলি এমন পদ্ধতি প্রদান করে যা প্রতিটি সিস্টেমে এবং অ্যানিমেশনগুলির মতো জটিল পরিস্থিতিতে কার্যকর হয় না। আমি নীচের থ্রেডে মিকটেক্সের উত্তরটি একবার দেখার পরামর্শ দিচ্ছি, যেখানে একটি শক্তিশালী পদ্ধতি পাওয়া গেছে: ম্যাটপ্ল্লোব অ্যানিমেশন শেষ না হওয়া পর্যন্ত কীভাবে অপেক্ষা করতে হবে?


0

আপনি যদি একাধিক পরিসংখ্যান খুলতে চান তবে সেগুলি সব খোলা রেখে এই কোডটি আমার পক্ষে কাজ করেছে:

show(block=False)
draw()

শো (ব্লক = মিথ্যা) অবমূল্যায়ন করা হয়েছে এবং এখন আর কাজ করছে না
বোগদান

0

ওপিএসের অনুরোধের সরাসরি উত্তর না দেওয়ার সময় আমি এই পোস্টটি পোস্ট করছি কারণ এটি এই পরিস্থিতিতে কারওর পক্ষে সহায়তা করতে পারে:

  • আমি পাইনস্টলারের সাথে একটি .exe তৈরি করছি যেহেতু আমি প্লটগুলি উত্পাদন করতে যেখানে পাইথন ইনস্টল করতে পারছি না, তাই প্লটটি তৈরি করার জন্য পাইথন স্ক্রিপ্টের প্রয়োজন, এটি .png হিসাবে সংরক্ষণ করুন, এটি বন্ধ করুন এবং পরবর্তীটিতে চালিয়ে যাব, বেশ কয়েকটি প্লট হিসাবে প্রয়োগ করা হয়েছে একটি লুপ বা একটি ফাংশন ব্যবহার করে।

আমি এই ব্যবহারের জন্য:

import matplotlib.pyplot as plt
#code generating the plot in a loop or function
#saving the plot
plt.savefig(var+'_plot.png',bbox_inches='tight', dpi=250) 
#you can allways reopen the plot using
os.system(var+'_plot.png') # unfortunately .png allows no interaction.
#the following avoids plot blocking the execution while in non-interactive mode
plt.show(block=False) 
#and the following closes the plot while next iteration will generate new instance.
plt.close() 

যেখানে "var" লুপের প্লটটি সনাক্ত করে তাই এটি ওভাররাইট করা হবে না।


-1

plt.show(block=False)আপনার স্ক্রিপ্ট কলটির শেষে এবং ব্যবহার করুন plt.show()

এটি নিশ্চিত করবে যে স্ক্রিপ্টটি শেষ হয়ে গেলে উইন্ডোটি বন্ধ হবে না।


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