আপেক্ষিক পথ থেকে একটি মডিউল আমদানি করুন


759

আমি পাইথন মডিউলটির আপেক্ষিক পথটি কীভাবে আমদানি করব?

উদাহরণস্বরূপ, যদি dirFooথাকে Foo.pyএবং dirBar, এবং dirBarরয়েছে Bar.py, কিভাবে আমি আমদানি না Bar.pyবা Foo.py?

এখানে একটি দৃশ্য উপস্থাপনা:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Fooঅন্তর্ভুক্ত করতে ইচ্ছুক Bar, তবে ফোল্ডার হায়ারার্কির পুনর্গঠন করা কোনও বিকল্প নয়।



3
আমার উত্তরটি দেখুন, এটি এখন পর্যন্ত সবচেয়ে সম্পূর্ণ, অন্যরা বিশেষ ক্ষেত্রে কাজ করছে না, উদাহরণস্বরূপ আপনি যখন অন্য ডিরেক্টরি থেকে স্ক্রিপ্টটি কল করেন বা অন্য পাইথন স্ক্রিপ্ট থেকে। দেখুন stackoverflow.com/questions/279237/...
sorin

আমারও একই সমস্যা ছিল এবং আমি এটি খুঁজে পেয়েছি এবং এটি কার্যকর হয়! apt-get পাইথন-প্রোফাইলার ইনস্টল করুন
ldcl289

5
ঠিক যদি কেউ এটি স্থিতিশীলভাবে করতে চায় এবং এখানে আসে (যেমন আমি করেছি :)
আপনিও পাইথনপথ

প্রতিটি ক্ষেত্রে লিব / সাইট.py এর নির্দেশাবলী অনুসরণ করা ভাল
গেজ

উত্তর:


333

ধরে নিই যে আপনার উভয় ডিরেক্টরি __init__.pyহ'ল পাইথন প্যাকেজ ( তাদের মধ্যে ফাইল রয়েছে), এখানে স্ক্রিপ্টের অবস্থানের তুলনায় মডিউলগুলি অন্তর্ভুক্ত করার নিরাপদ সমাধান রয়েছে is

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

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

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

সতর্কবাণী! বর্তমান মডিউল কোনও eggফাইলে থাকা অবস্থায় কী ঘটছে তা আমি সত্যিই জানি না । এটি সম্ভবত ব্যর্থ হয়।


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

উইন 7 প্রো 64x এবং পাইথন 2.7 চালানো আমি কয়েকটি ত্রুটি পেয়েছি। 1) আমদানি তালিকায় আমাকে পরিদর্শন যোগ করতে হয়েছিল। 2) টিপলে 1 ম মান, [0], একটি খালি স্ট্রিং। ২ য়, [১] ফাইলটির নাম দেখায়। আমি অনুমান করছি যে প্রথমটি পথ হওয়া উচিত ... কোনও ধারণা?
অ্যাডাম লুইস

2
আপনি যদি সাবফোল্ডারটির জন্য যাচ্ছেন তবে এটি এটির মতো ব্যবহার করুন : সাবফোল্ডারটি যুক্ত os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]) + "/subfolder")করবেন নাabspath কারণ এর ফলে গুরুতর ত্রুটি হয় causes
ম্যাক্সিমিলিয়ান হিলস

4
@ scr4ve পরিবর্তে আপনার os.path.join () ব্যবহার করা উচিত, এবং আমার উত্তরটিতে কেস ( cmd_subfolder) যুক্ত করার জন্য আপনাকে স্বাগত জানানো হচ্ছে । ধন্যবাদ!
sorin

7
আমার জন্য realpathইতিমধ্যে নিখুঁত পাথ তৈরি করেছে, সুতরাং আমার দরকার নেই abspath। এছাড়াও os.path.dirnameবিভাজনের পরিবর্তে ইনডেক্সিং [0]অপ্রচলিত করে ব্যবহার করা যেতে পারে । লাইনটি তখন থাকবে:os.path.realpath(os.path.dirname(inspect.getfile(inspect.currentframe())))
টেড হয়েছে

328

নিশ্চিত হয়ে নিন যে দিরবারের কাছে __init__.pyফাইল রয়েছে - এটি পাইথন প্যাকেজটিতে ডিরেক্টরি তৈরি করে।


204
নোট করুন যে এই ফাইলটি সম্পূর্ণ খালি থাকতে পারে।
হারলে হলক্বে

47
তাহলে dirBar এর পেরেন্ট ডাইরেক্টরি নয় sys.pathতারপর উপস্থিতিতে __init__.pyমধ্যে dirBarডিরেক্টরি অনেক সাহায্য করে না।
jfs

7
-1, যুক্ত করা __init.py__কেবল তখনই কাজ করবে যখন ডিরেক্টরিটি ইতিমধ্যে সিস্টেমেপথে রয়েছে এবং আমার ক্ষেত্রে এটি ছিল না। "Sorin" (স্বীকৃত এক) দ্বারা সমাধান সর্বদা কাজ করে।
Czarek Tomczak

12
"ডিরেক্টরি যখন ইতিমধ্যে sys.path এ থাকে"। পুরোপুরি সত্য হলেও আমরা কীভাবে অনুমান করতে পারি যে sys.pathপ্রশ্নটি ডিরেক্টরি থেকে নেই? সম্ভবত এমন কিছু বাদ দেওয়া হয়েছিল যা আমরা দেখিনি বা জানতাম না?
এস .লট

4
এটি কোনও হ'ল প্রশ্নের উত্তরটির অর্থ: আরম্ভের ফাইলটি আছে কিনা তা এই উপ-ডিরেক্টরিগুলিতে অজগরটিকে দেখায় না। এটি কীভাবে শত শত উপার্জন পেল?
জেনেটে 16

261

আপনি আপনার পাইথন পথে সাব-ডিরেক্টরিটি যুক্ত করতে পারেন যাতে এটি একটি সাধারণ স্ক্রিপ্ট হিসাবে আমদানি করে।

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar

6
দেখে মনে হচ্ছে আপনার উত্তর আপেক্ষিক পাথের সাথে কাজ করে না, দেখুন stackoverflow.com/questions/279237/…
বোগদান

24
এই করে আপেক্ষিক পাথ সঙ্গে কাজ - আপনি শুধু বুঝতে পেরেছিল যে একটি আপেক্ষিক পাথ বর্তমান ডিরেক্টরির চালানো যা থেকে এই একটি দ্রুত হ্যাক ছাড়া অন্য কিছুর জন্য একটি দরিদ্র সমাধান তোলে উপর নির্ভর করবে প্রয়োজন।
Nomar

12
আপনি এর মতো কিছু করতে পারেনsys.path.append(os.path.dirname(__file__) + "/relative/path/to/module")
ফালকো

বাsys.path.append(__name__ if __name__ != '__main__' else __loader__.fullname)
ভীম

1
sys.path.insert(0, <path to dirFoo>)অন্য কোনও স্থানে একই নামের মডিউলগুলির আগে এটি এই মডিউলটি লোড করবে বলে ব্যবহার করার বিষয়টি বিবেচনা করুন ।
আন্তন তারাসেনকো

117
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule

2
আমি এটি পছন্দ করি কারণ আপনার ডিরেক্টরিতে যাওয়ার নমনীয়তা রয়েছে।
চার্লস এল।

21
os.path.join()'/' দ্বারা যোগদানের পরিবর্তে আপনার ব্যবহার করা উচিত , যা (খোঁড়া) উইন্ডোতে ভেঙে যাবে।
0xc0de

18
এটি নির্ভরযোগ্য নয়। এটি বর্তমানে চলমান কর্মনির্দেশক ডিরেক্টরি যা আছে তার উপর নির্ভর করে, স্ক্রিপ্টটি যে ডিরেক্টরিটিতে থাকে তার উপর নয়।
জেমসডলিন

পথটি ইতিমধ্যে পথে না থাকলে কেবল যুক্ত করতে চাই। lib_path = os.path.abspath ('../ ফাংশন') যদি lib_path sys.path: sys.path.append (lib_path)
ব্রেন্ট

@ জেমসডলিনের উত্তরে কয়েকটি উত্তর মিলিয়ে: কী হবে os.path.abspath(os.path.join(__file__,'..','lib'))?
ম্যাথু ডেভিস

107

আলাদা ফোল্ডার থেকে .py ফাইলটি আমদানি করার জন্য সহজ কিছু করুন।

ধরা যাক আপনার মতো ডিরেক্টরি রয়েছে:

lib/abc.py

তারপরে নাম হিসাবে খালি ফাইলটি lib ফোল্ডারে রাখুন

__init__.py

এবং তারপরে ব্যবহার করুন

from lib.abc import <Your Module name>

__init__.pyআমদানি মডিউলের শ্রেণিবিন্যাসের প্রতিটি ফোল্ডারে ফাইলটি রাখুন ।


79

আপনি যদি এইভাবে আপনার প্রকল্পটি কাঠামো করেন:

src\
  __init__.py
  main.py
  dirFoo\
    __init__.py
    Foo.py
  dirBar\
    __init__.py
    Bar.py

তারপরে Foo.py থেকে আপনার করা উচিত:

import dirFoo.Foo

বা:

from dirFoo.Foo import FooObject

টমের মন্তব্য অনুসারে, এটির প্রয়োজন নেই যে srcফোল্ডারটি site_packagesআপনার অনুসন্ধানের পথের মাধ্যমে অ্যাক্সেসযোগ্য । এছাড়াও, যেমন তিনি উল্লেখ করেছেন, __init__.pyআপনি প্রথমে সেই প্যাকেজ / ডিরেক্টরিতে কোনও মডিউল আমদানি করলে সুস্পষ্টভাবে আমদানি করা হয়। সাধারণত __init__.pyখালি ফাইল।


সেই প্যাকেজের অভ্যন্তরে প্রথম মডিউল আমদানি করা হলে init .py আমদানি করা হয় তাও উল্লেখ করুন । এছাড়াও, আপনার উদাহরণটি কেবল তখনই কাজ করবে যদি সাইট-প্যাকেজগুলিতে (বা অনুসন্ধানের পথে) এসসিআর হয়
টম লেইস

3
এটি আমি সর্বাধিক সহজ সমাধান খুঁজছিলাম। যদি আমদানির ফাইলটি কোনও সাব-ডিরেক্টরিতে থাকা নিশ্চিত হয় তবে এই সমাধানটি একটি রত্ন।
দীপক জিএম

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

9
কেন কেউ Foo.py থেকে নিজেই ফু আমদানি করতে চান। বার.পি থেকে হওয়া উচিত, আমার ধারণা।
ভাস্করক

from dirFoo import Fooবলতে Foo.bla()। যদি ব্যবহার করা হয় import dirFoo.Fooতবে এটি ব্যবহার করা উচিত dirFoo.Foo.bla()- উট কেস ছাড়াই বেশ কদর্য।
সিইস টিমারম্যান

45

সবচেয়ে সহজ পদ্ধতি হ'ল sys.path.append () ব্যবহার করা।

তবে আপনি ইমপ মডিউলটিতেও আগ্রহী হতে পারেন । এটি অভ্যন্তরীণ আমদানি কার্যগুলিতে অ্যাক্সেস সরবরাহ করে।

# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file 

আপনি যখন কোনও মডিউলটির নাম জানেন না তখন এটি গতিশীলভাবে মডিউলগুলি লোড করতে ব্যবহৃত হতে পারে।

আমি এটি অতীতে একটি অ্যাপ্লিকেশনটিতে একটি প্লাগইন টাইপ ইন্টারফেস তৈরি করতে ব্যবহার করেছি, যেখানে ব্যবহারকারী অ্যাপ্লিকেশন নির্দিষ্ট ফাংশন সহ একটি স্ক্রিপ্ট লিখতে পারে এবং একটি নির্দিষ্ট ডিরেক্টরিতে কেবল স্ক্রিপ্টটি ফেলে দেয়।

এছাড়াও, এই ফাংশনগুলি কার্যকর হতে পারে:

imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)

নোট করুন যে ডকুমেন্টেশনে ইম। লোড_সোর্স এবং ইমপি লোড_কম্পাইলগুলি অপ্রচলিত হিসাবে তালিকাভুক্ত করা হয়েছে। পরিবর্তে imp.find_module এবং imp.load_module বাঞ্ছনীয়।
amicitas

@ অ্যামিভিটাস, আপনি কি দয়া করে এর জন্য কোনও রেফারেন্স সরবরাহ করতে পারেন (আমার এটি প্রয়োজন, এবং আমি পাইথন ২.6 ব্যবহার করছি। আমি এই বিষয়ে ২.7 ডক্স কী বলেছি তা অবগত রয়েছি, তবে ২.6 সম্পর্কিত কোনও রেফারেন্স
পাইনি

@ 0xc0de আপনি পাইথন ২.7.৩ এবং পাইথন ২.6 . both উভয়ের জন্য ইমপ মডিউলটির জন্য ডক্সে এই বিবৃতিটি পেতে পারেন । দেখে মনে হচ্ছে those ফাংশনগুলি অজগর 3.2 এর জন্য ডক্সেও নেই।
অ্যামিসিটাস

1
পাইথন ৩.৩-তে এর মতো উত্স ফাইলগুলি আমদানির জন্য, অ্যাবিট্রিয়াল পাইথন উত্স ফাইলটি আমদানি দেখুন (পাইথন ৩.৩++) - স্ট্যাক ওভারফ্লো । ধন্যবাদ, টিপস জন্য এখানে ভাবেন।
nealmcb

44

এটি প্রাসঙ্গিক পিইপি:

http://www.python.org/dev/peps/pep-0328/

বিশেষত, অনুমান করা যায় যে ডিরফু একটি ডিরেক্টরি যা দিরবার থেকে ...

DirFoo \ Foo.py এ:

from ..dirBar import Bar

এটা আমার জন্য কাজ করছে, শুধু যোগ Init আমদানি প্রতি ফোল্ডার এবং সাফল্যের .py
yussan

23

আপনার স্ক্রিপ্টে কোনও পরিবর্তন ছাড়াই সহজতম উপায় হ'ল পাইথনপথ পরিবেশ পরিবর্তনশীল সেট করা। কারণ sys.path এই অবস্থানগুলি থেকে শুরু করা হয়েছে:

  1. ইনপুট স্ক্রিপ্ট (বা বর্তমান ডিরেক্টরি) ধারণকারী ডিরেক্টরি।
  2. পাইথনপথ (শেল ভেরিয়েবল PATH এর মতো একই সিনট্যাক্স সহ ডিরেক্টরি নামের একটি তালিকা)।
  3. ইনস্টলেশন-নির্ভর ডিফল্ট।

শেষ ঘন্টা:

export PYTHONPATH=/absolute/path/to/your/module

আপনি sys.path উপরের পাথের উপরে থাকবে যেমন নীচে দেখানো হবে:

print sys.path

['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

13

আমার মতে সর্বাধিক পছন্দ হ'ল __ init __.py ফোল্ডারে রাখুন এবং ফাইলটি কল করুন

from dirBar.Bar import *

Sys.path.append () ব্যবহার করার পরামর্শ দেওয়া হয় না কারণ আপনি যদি অজগর প্যাকেজ হিসাবে একই ফাইলটির নাম ব্যবহার করেন তবে কিছু ভুল হতে পারে। আমি এটি পরীক্ষা করি নি তবে তা দ্বিধাগ্রস্ত হবে।


অদ্ভুত যে from dirBar.Bar import *কাজ করে, কিন্তু না from dirBar.Bar import Bar। আপনি কি জানেন যে * কেন কাজ করে? আমার যদি একাধিক ফাইল দিরবার / / এ থাকত এবং সেগুলির মধ্যে কেবলমাত্র কয়েকটিকে (আপনি এখানে পোস্ট করেছেন এমন একটি পদ্ধতি ব্যবহার করে) ধরতে চান?
পরীক্ষক

2
@tester: ব্যবহার করুন from dirBar import Bar
নোবার

@ এর পরে এটি কারণ কারণ fromসূত্রটি ইঙ্গিত করে এবং তার পরে সবকিছুই importসেই উত্স থেকে কী গ্রহণ করবে। from dirBar.Bar import Barএর অর্থ "উত্স থেকে, উত্স নিজেই আমদানি করুন", যা কোনও অর্থ দেয় না। *মানে যদিও, "আমাকে উৎস থেকে সবকিছু দিতে"
FuriousFolder

11

লিনাক্স ব্যবহারকারীদের জন্য দ্রুত এবং নোংরা উপায়

যদি আপনি কেবল চারপাশে ঝাঁকুনি দিচ্ছেন এবং মোতায়েনের সমস্যাগুলির বিষয়ে চিন্তা না করেন তবে অনুরোধ মডিউলটির ফোল্ডারে মডিউল বা প্যাকেজটি সরাসরি দৃশ্যমান করতে আপনি একটি প্রতীকী লিঙ্কটি (আপনার ফাইল সিস্টেমটি এটি সমর্থন করে) ধরে নিতে পারেন।

ln -s (path)/module_name.py

অথবা

ln -s (path)/package_name

দ্রষ্টব্য: একটি "মডিউল" হ'ল .py এক্সটেনশন সহ যে কোনও ফাইল এবং "প্যাকেজ" এমন কোনও ফোল্ডার __init__.pyযা ফাইল থাকে (যা খালি ফাইল হতে পারে)। ব্যবহারের দৃষ্টিকোণ থেকে, মডিউল এবং প্যাকেজগুলি অভিন্ন - উভয়ই importকমান্ডের মাধ্যমে অনুরোধ অনুযায়ী তাদের ধারণকৃত "সংজ্ঞা এবং বিবৃতি" প্রকাশ করে ।

দেখুন: http://docs.python.org/2/tutorial/modules.html


10
from .dirBar import Bar

পরিবর্তে:

from dirBar import Bar

সেক্ষেত্রে অন্য একটি ডিসবার ইনস্টল থাকতে পারে এবং একটি foo.py পাঠককে বিভ্রান্ত করতে পারে।


2
আমি উইন্ডোতে এটি করতে সক্ষম ছিল না। এটি কি লিনাক্সে?
গ্যাব্রিয়েল

1
এটি ফু থেকে আমদানি করা কোনও স্ক্রিপ্ট থেকে কাজ করবে। যেমন: main.py আমদানি dirFoo.Foo। আপনি যদি স্ক্রিপ্ট হিসাবে Foo.py চালানোর চেষ্টা করছেন তবে এটি ব্যর্থ হবে। দেখুন stackoverflow.com/questions/72852/...
jgomo3

9

এই কেসটিকে বার.পুটকে Foo.py এ আমদানি করার জন্য, আমি প্রথমে এই ফোল্ডারগুলিকে পাইথন প্যাকেজগুলিতে পরিণত করব:

dirFoo\
    __init__.py
    Foo.py
    dirBar\
        __init__.py
        Bar.py

তারপরে আমি এটিকে Foo.py এ করব would

from .dirBar import Bar

আমি চাইলে নামের স্থানটি বারের মতো দেখতে look যাই হোক না কেন , বা

from . import dirBar

আমি চাইলে নামবার্তা দিরবার.বার। যাই হোক না কেন । DirBar প্যাকেজের অধীনে আপনার আরও মডিউল থাকলে এই দ্বিতীয় কেসটি কার্যকর।


7

একটি __init__.py ফাইল যুক্ত করুন:

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

তারপরে Foo.py এর শুরুতে এই কোডটি যুক্ত করুন:

import sys
sys.path.append('dirBar')
import Bar

5
যদি dirBarইতিমধ্যে পাইথন প্যাকেজ হয় (অস্তিত্বের দ্বারা dirBar/__init__.py), সেখানে যুক্ত dirBarহওয়ার দরকার sys.pathনেই, না? বিবৃতি import Barথেকে Foo.pyচলা উচিত নয়।
সান্টা

5

আপেক্ষিক sys.path উদাহরণ:

# /lib/my_module.py
# /src/test.py


if __name__ == '__main__' and __package__ is None:
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module

এই উত্তরের ভিত্তিতে ।


5

ঠিক আছে, যেমন আপনি উল্লেখ করেছেন, সাধারণত আপনি যেখানে আপনার মূল স্ক্রিপ্টটি চালিত হয় সে সম্পর্কিত আপনার মডিউলগুলির সাথে একটি ফোল্ডারে অ্যাক্সেস পেতে চান, সুতরাং আপনি কেবল সেগুলি আমদানি করুন।

সমাধান:

আমার স্ক্রিপ্ট D:/Books/MyBooks.pyএবং কিছু মডিউল রয়েছে (যেমন oldies.py)। আমাকে উপ-ডিরেক্টরি থেকে আমদানি করতে হবে D:/Books/includes:

import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path)  # Just verify it is there
import oldies

একটি print('done')ভিতরে রাখুন oldies.py, যাতে আপনি যাচাই করেন সবকিছু ঠিকঠাক চলছে। এই পথটি সর্বদা কাজ করে কারণ sys.pathপ্রোগ্রাম সূচনার সূচনা হিসাবে পাইথন সংজ্ঞা দ্বারা , এই তালিকার প্রথম আইটেম,path[0] হ'ল পাইথন ইন্টারপ্রেটারকে অনুরোধ করার জন্য স্ক্রিপ্টযুক্ত ডিরেক্টরিটি।

যদি স্ক্রিপ্ট ডিরেক্টরিটি উপলভ্য না হয় (উদাহরণস্বরূপ যদি ইন্টারপ্রিটার ইন্টারেক্টিভভাবে ডাকা হয় বা স্ক্রিপ্টটি স্ট্যান্ডার্ড ইনপুট থেকে পড়ে থাকে), path[0]খালি স্ট্রিংটি, যা পাইথনকে বর্তমান ডিরেক্টরিতে মডিউলগুলি অনুসন্ধান করার জন্য নির্দেশ দেয়। লক্ষ্য করুন যে স্ক্রিপ্ট ডিরেক্টরিটি প্রবেশের ফলাফল হিসাবে প্রবেশের আগে সন্নিবেশ করা হয়েছিল PYTHONPATH


1
site.addsitedir(sys.path[0]+'/includes')আমার প্রথম সাধারণ পাইথন প্রোগ্রাম ব্রেক_টাইম.পি: https://github.com/ltfschoen/PythonTest- এ আমাকে দুটি ব্যাকস্ল্যাশ (অর্থাত্ ) পরিবর্তে একটি ফরোয়ার্ড স্ল্যাশ ব্যবহার করতে হয়েছিল । আমি সিস্টেমটি ব্যবহার করি: ম্যাকোএস ভি 10.11.5, পাইথন 2.7.12, আইডিএল আইডি 2.7.12, 8.5.9 টাকা
লূক শোয়েন

4

সহজভাবে আপনি ব্যবহার করতে পারেন: from Desktop.filename import something

উদাহরণ:

প্রদত্ত যে ফাইলটি test.pyডিরেক্টরিতে নাম Users/user/Desktop, এবং কখনও কিছুই আমদানি করবে will

কোড:

from Desktop.test import *

তবে নিশ্চিত হয়ে নিন যে আপনি " __init__.py" ডিরেক্টরিতে একটি খালি ফাইল তৈরি করেছেন


1
তারাযুক্ত আমদানির বিরুদ্ধে পরামর্শ দেওয়া হচ্ছে। দেখুন: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

আমি জানি যে কেন আমি প্রথমে লিখেছিলাম import somethingতারপর আমি বলেছিলাম যে এটি সহজভাবে *
ম্যামের পক্ষে

3

আর একটি সমাধান হ'ল পাই-আবশ্যক প্যাকেজটি ইনস্টল করা এবং তারপরে নিম্নলিখিতটি ব্যবহার করুনFoo.py

import require
Bar = require('./dirBar/Bar')

ইউআরএলটি আসলে পাইপআই.আর / প্রজেক্ট / রিচার্য়.পি বলে মনে হচ্ছে এবং নোট করুন যে এটি পিপের মাধ্যমে ইনস্টল করা দরকার।
ফ্ল্যাশ শেরিডান

1
@ ফ্ল্যাশশেরিডন নাপ, এটি একটি ভিন্ন প্রকল্প। আমি পাই-আবশ্যকটিকে মুছে ফেলেছি কারণ আমি নিশ্চিত যে কেউ এটি ব্যবহার করছে না, যদিও আমি এই পোস্টটি ভাবিনি। আপনার যদি এখনও কোনও require()ফাংশন প্রয়োজন হয়, আপনি আমার নোড.পি প্রকল্পটি একবার দেখে নিতে পারেন: github.com/nodepy/nodepy
নিক্লাস আর

2

আপেক্ষিক পথটি ব্যবহার করে উপরের এক স্তর থেকে একটি ফাইল আমদানির জন্য এখানে একটি উপায়।

মূলত, কেবল ওয়ার্কিং ডিরেক্টরিটিকে একটি স্তর (বা কোনও আপেক্ষিক অবস্থান) এর উপরে নিয়ে যান, এটিকে আপনার পথে যুক্ত করুন, তারপরে ওয়ার্কিং ডিরেক্টরিটি যেখানে শুরু হয়েছিল সেখানে ফিরে যান।

#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path =  os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)

1
আমি এখানে আপনার যুক্তি বুঝতে পারি না। এটি অতি জটিল
ট্রান্সিলভ্ল্যাড

0

আমি পাইথন সম্পর্কে অভিজ্ঞ নই, তাই আমার কথায় যদি কোনও ভুল থাকে তবে কেবল আমাকে বলুন। আপনার ফাইলের শ্রেণিবিন্যাস যদি এভাবে সাজানো থাকে:

project\
    module_1.py 
    module_2.py

module_1.pyএকটি ফাংশন বলা সংজ্ঞায়িত func_1(), module_2.py :

from module_1 import func_1

def func_2():
    func_1()

if __name__ == '__main__':
    func_2()

এবং আপনি python module_2.pyসেমিডিতে চালাবেন , এটি যা func_1()সংজ্ঞায়িত করবে তা চালানো হবে । সাধারণত আমরা একই শ্রেণিবিন্যাস ফাইলগুলি আমদানি করি। কিন্তু যখন আপনি লিখতে from .module_1 import func_1মধ্যে module_2.py, পাইথন ইন্টারপ্রেটার বলবে No module named '__main__.module_1'; '__main__' is not a package। সুতরাং এটি ঠিক করার জন্য, আমরা কেবলমাত্র আমাদের পরিবর্তনটি রেখেছি এবং মডিউল উভয়টিকে একটি প্যাকেজে সরিয়ে নিয়েছি, এবং কলার হিসাবে তৃতীয় মডিউল তৈরি করি module_2.py

project\
    package_1\
        module_1.py
        module_2.py
    main.py

main.py :

from package_1.module_2 import func_2

def func_3():
    func_2()

if __name__ == '__main__':
    func_3()

কিন্তু কারণ আমরা একটি যোগ .সামনে module_1module_2.pyযে যদি আমরা যে এবং চালানোর না হয় main.py, পাইথন ইন্টারপ্রেটার বলবে No module named 'module_1', যে একটি সামান্য চতুর এর module_1.pyডান পাশে হয় module_2.py। এখন আমি দিন func_1()মধ্যে module_1.pyকি কিছু:

def func_1():
    print(__name__)

যে __name__রেকর্ডগুলি কে ফানকে কল করে। এখন আমরা .আগে রাখি module_1, চালান main.py, এটি মুদ্রণ করবে package_1.module_1, না module_1। এটি ইঙ্গিত করে যে যিনি ডাকেন func_1()তিনি হলেন একই শ্রেণিবিন্যাসের মতো main.py, .বোঝানো যা নিজের module_1মতো একই শ্রেণিবিন্যাসে module_2.py। সুতরাং যদি কোনও বিন্দু না থাকে তবে নিজের মতো একই শ্রেণিবিন্যাসে main.pyস্বীকৃতি module_1জানাতে পারে, এটি সনাক্ত করতে পারে package_1তবে এটি "অধীন" কী তা নয়।

এখন এটি কিছুটা জটিল করে তুলি। আপনার একটি config.iniএবং একটি মডিউল একটি ফাংশনটিকে একই মস্তিষ্কে 'মেইন.পি' হিসাবে পড়তে সংজ্ঞায়িত করে।

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
    main.py

এবং কিছু অনিবার্য কারণে, আপনাকে এটির সাথে কল করতে হবে module_2.py, সুতরাং এটি উপরের স্তরক্রম থেকে আমদানি করতে হবে। মডিউল_পিপি :

 import ..config
 pass

দুটি বিন্দু মানে উপরের স্তরক্রম থেকে আমদানি করা (তিনটি বিন্দু উপরের থেকে উপরের অ্যাক্সেস ইত্যাদি) and এখন আমরা চালাতে main.py, অনুবাদক বলবেঃ ValueError:attempted relative import beyond top-level package। এখানে "শীর্ষ স্তরের প্যাকেজ" রয়েছে main.py। কেবল config.pyপাশে থাকার কারণে main.py, তারা একই শ্রেণিবিন্যাসে রয়েছে, config.py"অধীনে" নয় main.py, বা এটি "নেতৃত্বাধীন" নয় main.py, তাই এটি অতিক্রম করে main.py। এটি ঠিক করার জন্য, সহজতম উপায় হ'ল:

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
main.py

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


-5

এটি কাজ করে, এবং sysমডিউলটির সাথে যে কোনও কিছুর চেয়ে অনেক সহজ :

with open("C:/yourpath/foobar.py") as f:
    eval(f.read())

1
ওপি যদি কোনও পাথ হার্ডকোডে যাচ্ছিল, তারা যেভাবেই হোক পাইথনপথে pathোকাতে পারে। আমি মনে করি পয়েন্টটি এমনভাবে করছে যে কোনও পথকে হার্ডকোড দেয় না কারণ এটি অন্য কোথাও ভেঙে যায়।
ম্যাথু

-15

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

import os, sys
from subprocess import Popen, PIPE
try:
    path = Popen("find / -name 'file' -type f", shell=True, stdout=PIPE).stdout.read().splitlines()[0]
    if not sys.path.__contains__(path):
        sys.path.append(path)
except IndexError:
    raise RuntimeError("You must have FILE to run this program!")

এটি অবশ্যই যদি না আপনি এগুলি প্যাকেজ করার পরিকল্পনা করেন। তবে যদি এটি হয় তবে আপনার আর যাইহোক দুটি পৃথক ফাইলের দরকার নেই।


11
সুপার অদক্ষ!
0xc0de

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