যখন মডিউলটির একটি '-' ড্যাশ বা হাইফেন থাকে তখন মডিউলটি কীভাবে আমদানি করবেন?


194

আমি foo-bar.py আমদানি করতে চাই। এইটা কাজ করে:

foobar = __import__("foo-bar")

এটি করে না:

from "foo-bar" import *

আমার প্রশ্ন: আমি কি কোনও উপায় আছে যে আমি উপরের ফর্ম্যাটটি ব্যবহার করতে পারি, যেমন from "foo-bar" import *কোনও মডিউলটি এতে আমদানি করতে -পারি?


10
এর নামে ড্যাশ সহ আপনার কেন একটি মডিউল রয়েছে?
মাট্টি ভির্ককুনেন

23
আমি অনুমান করছি এটি মডিউল হিসাবে না বরং মূলত একটি স্ক্রিপ্ট হিসাবে লেখা হয়েছিল।
মাইকেল হফম্যান


@ মন্টিভির্ককুনেন মেকি.পি.পি উইন com২ কমের এতে ড্যাশ সহ মডিউল তৈরি করবে। খুব খারাপ. কমটাইপগুলি এটিকে আন্ডারস্কোর রূপান্তর করে সমাধান করেছে
swdev

2
@ মাট্টিভির্ককুনেন আমি মনে করি পাইথন যে নামগুলি আমার ডিরেক্টরিতে দিতে পারি তার সীমাবদ্ধ করা উচিত নয়। এটি করা তার দায়িত্ব নয়।
জেলফির কালটসটহল

উত্তর:


116

আপনি পারবেন না foo-barএকটি সনাক্তকারী নয়। ফাইলটির পুনরায় নামকরণ করুনfoo_bar.py

সম্পাদনা: যদি importআপনার লক্ষ্য না হয় (যেমন: আপনি sys.modulesযা করেন তার দিকে খেয়াল রাখেন না, নিজেকে আমদানি করার দরকার নেই), কেবলমাত্র ফাইলের সমস্ত গ্লোবালকে আপনার নিজস্ব সুযোগে পেয়ে আপনি ব্যবহার করতে পারেনexecfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

24
পাইথন ৩.x পাইথন In.০ এ নতুন কী রয়েছে তা অপসারণযোগ্য এক্সফিল ()। execfile(fn)ব্যবহারের পরিবর্তে exec(open(fn).read())প্যাকেজ আমদানিও রয়েছে।
দেবপ্লেয়ার

104

পাইথন নামকরণের কনভেনশনগুলির সাথে মিল রাখতে আপনি যদি মডিউলটির নাম পরিবর্তন করতে না পারেন তবে মধ্যস্থতাকারী হিসাবে কাজ করতে একটি নতুন মডিউল তৈরি করুন:

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 

28
আমি কখনই এটিকে বাস্তবায়ন করব না। তবে আমি এই হ্যাকের নিখুঁত উজ্জ্বলতার জন্য +1 দিতে পারি না
ইন্সপেক্টর

11
আপনি আসলে ছাড়াই এই কাজ করতে পারে foo_proxy.pyফাইল, আউটপুট নির্ধারণ __import__(...)করতে sys.modules['foo_proxy']। আসলে, এটি করবেন না, এটি একটি ভয়ানক ধারণা।
সিঙ্গেলাইজেশন ইলিমিনেশন

3
আমি যা খুঁজছিলাম ঠিক শীতল। একটি ব্যবহারক্ষেত্র রয়েছে, যদি কেউ দেশীয় গ্রন্থাগারগুলি ব্যবহার করে যা বিতরণ সহ প্রেরণ করা হয়।
সোভেন


46

আপনি যদি মূল ফাইলটির নাম পরিবর্তন করতে না পারেন তবে আপনি একটি সিমিলিংকও ব্যবহার করতে পারেন:

ln -s foo-bar.py foo_bar.py

তারপরে আপনি ঠিক করতে পারেন:

from foo_bar import *

2

অন্যের মতো বলেছিলেন যে আপনি পাইথন নামকরণে "-" ব্যবহার করতে পারবেন না, সেখানে অনেকগুলি কাজের ক্ষেত্র রয়েছে, এটির মতো একটি কাজ যা আপনাকে যদি কোনও পথ থেকে একাধিক মডিউল যুক্ত করতে হয় তবে এটি কার্যকর হবে sys.path

উদাহরণস্বরূপ যদি আপনার কাঠামোটি এর মতো হয়:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

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