2016-11-04 13 views
8

मैं एक अजगर परियोजना है कि संरचित है इस प्रकार है कहते हैं:फ़ाइल पढ़ी जा अजगर परियोजना में रिश्तेदार पथ का उपयोग

import package 

print(package.test) 

जब मैं main.py चलाने मैं निम्नलिखित त्रुटि मिलती है:

C:\Users\Patrick\Desktop\project>python main.py 
Traceback (most recent call last): 
    File "main.py", line 1, in <module> 
    import package 
    File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module> 
    from .module import test 
    File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module> 
    with open("../data/test.csv") as f: 
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv' 

हालांकि, अगर मैं package निर्देशिका मैं कोई त्रुटि मिल से module.py चलाते हैं। तो ऐसा लगता है कि open(...) में उपयोग किया जाने वाला सापेक्ष पथ केवल मूल फ़ाइल से चल रहा है (iee __name__ == "__main__") से संबंधित है? मैं पूर्ण पथ का उपयोग नहीं करना चाहता। इससे निपटने के कुछ तरीके क्या हैं?

+1

पीईपी 8 से उद्धरण, एक एसडेनोट के रूप में: _ "इंट्रा-पैकेज आयात के लिए सापेक्ष आयात अत्यधिक निराश हैं। हमेशा सभी आयातों के लिए पूर्ण पैकेज पथ का उपयोग करें। "_ यहां, 'पैकेज. मॉड्यूल आयात परीक्षण' से। – spectras

उत्तर

16

सापेक्ष पथ current working directory के सापेक्ष हैं। यदि आप अपना रास्ता नहीं चाहते हैं, तो यह पूर्ण होना चाहिए।

लेकिन वहाँ एक अक्सर इस्तेमाल किया चाल वर्तमान स्क्रिप्ट से एक निरपेक्ष पथ का निर्माण करना है: अपने __file__ विशेष विशेषता का उपयोग: अजगर 3.4 से

import csv 
import os.path 

my_path = os.path.abspath(os.path.dirname(__file__)) 
path = os.path.join(my_path, "../data/test.csv") 
with open(path) as f: 
    test = list(csv.reader(f)) 

ध्यान दें,, __file__ हमेशा आयातित मॉड्यूल के लिए पूर्ण है और आप छोड़ सकते हैं इस उदाहरण में os.path.abspath भाग। यह नहीं कि यह सख्ती से जरूरी है, लेकिन यदि आप किसी बिंदु पर वर्तमान कार्यशील निर्देशिका को बदलते हैं और आपके मॉड्यूल को रिश्तेदार पथ का उपयोग करके आयात किया गया है तो यह आश्चर्य से बचाता है।

संबंधित मुद्दे